Database adalah latin1_general_ci
sekarang dan saya ingin mengubah collation untuk utf8mb4_general_ci
.
Apakah ada pengaturan di PhpMyAdmin untuk mengubah collation dari database, tabel, kolom? Daripada mengubah satu per satu?
Yang anda butuhkan untuk mengkonversi meja masing-masing individu:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(ini akan mengkonversi kolom hanya sebagai baik), atau ekspor database dengan latin1
dan impor kembali dengan utf8mb4
.
Saya berkontribusi di sini, sebagai OP bertanya:
Cara mengubah collation dari database, tabel, kolom?
Jawaban yang dipilih hanya negara-negara itu pada tingkat tabel.
Mengubah database yang luas:
ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Perubahan itu per meja:
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Praktek yang baik adalah untuk mengubah itu di tingkat tabel sebagai it'll perubahan itu untuk kolom juga. Berubah untuk kolom tertentu adalah untuk setiap kasus tertentu.
Mengubah collation untuk kolom tertentu:
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Anda dapat menjalankan script php.
<?php
$con = mysql_connect('localhost','user','password');
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db('dbname');
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}}
echo "The collation of your database has been successfully changed!";
?>
Untuk mengubah collation untuk tabel individual yang dapat anda gunakan,
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8
Untuk mengatur default pemeriksaan untuk seluruh database,
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
atau yang lain,
Goto PhpMyAdmin->Operasi->Pemeriksaan.
Di sana anda menemukan sebuah kotak pilih yang berisi semua exsiting collations. Sehingga di sini anda dapat mengubah pemeriksaan anda. Jadi di sini setelah tabel database akan mengikuti pemeriksaan sementara anda membuat kolom baru . Tidak perlu pilih pemeriksaan saat membuat kolom baru.
Query berikut ini akan menghasilkan MENGUBAH kueri yang mengubah pemeriksaan untuk semua kolom yang sesuai dalam semua tabel yang untuk jenis tertentu (utf8_general_ci dalam contoh di bawah ini).
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.data_type,
'(' ,
CHARACTER_MAXIMUM_LENGTH,
')',
' CHARACTER SET utf8 COLLATE utf8_general_ci;'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'you_db_name_goes_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
Jika anda menjalankan phpMyAdmin >> pilih database >> pilih table >> pergi "Operasi" tab >> di "pilihan Meja" bagian >> anda dapat memilih Pemeriksaan dari daftar drop-down >> dan setelah anda tekan {Pergi} di bagian atas layar anda akan melihat pesan:
SQL query yang telah dilaksanakan dengan sukses
dan script
ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Tapi itu TIDAK akan mengubah collations dari kolom yang sudah ada. Untuk melakukannya, anda dapat menggunakan script ini (yang satu ini juga datang dari phpMyAdmin)
ALTER TABLE `tableName` CHANGE `Name` `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
anda dapat mengatur default pemeriksaan pada beberapa tingkatan:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
Saya terkejut untuk belajar, dan jadi aku harus datang kembali ke sini dan laporan, bahwa sangat baik dan terawat dengan baik Interkoneksi/AMAN CARI DAN GANTI DI DATABASE script ini memiliki beberapa opsi untuk mengkonversi tabel ke utf8 / unicode, dan bahkan untuk mengkonversi ke innodb. It's sebuah script yang biasa digunakan untuk migrasi database driven website (Wordpress, Drupal, Joomla, dll) dari satu domain ke domain yang lain.
Anda dapat dengan mudah menambahkan kode ini ke file script
//Database Connection
$host = 'localhost';
$db_name = 'your_database_name';
$db_user = 'your_database_user_name';
$db_pass = 'your_database_user_password';
$con = mysql_connect($host,$db_user,$db_pass);
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db($db_name);
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}
}
echo "The collation of your database has been successfully changed!";
Anda dapat mengubah CHARSET dan PEMERIKSAAN semua tabel melalui script PHP sebagai berikut. Saya suka jawaban dari hkasera tapi masalah dengan itu adalah bahwa query berjalan dua kali pada masing-masing meja. Kode ini hampir sama kecuali menggunakan MySqli bukan mysql dan pencegahan double query. Jika aku bisa memilih, aku akan memilih hkasera's jawaban up.
<?php
$conn1=new MySQLi("localhost","user","password","database");
if($conn1->connect_errno){
echo mysqli_connect_error();
exit;
}
$res=$conn1->query("show tables") or die($conn1->error);
while($tables=$res->fetch_array()){
$conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";
$res->free();
$conn1->close();
?>
Saya baca di sini, yang anda butuhkan untuk mengkonversi setiap tabel secara manual, itu tidak benar. Berikut adalah solusi cara melakukannya dengan prosedur yang disimpan:
DELIMITER $$
DROP PROCEDURE IF EXISTS changeCollation$$
-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_table_name varchar(255) DEFAULT "";
DECLARE v_message varchar(4000) DEFAULT "No records";
-- This will create a cursor that selects each table,
-- where the character set is not the one
-- that is defined in the parameter
DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');
-- This handler will set the value v_finished to 1
-- if there are no more rows
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN alter_cursor;
-- Start a loop to fetch each rows from the cursor
get_table: LOOP
-- Fetch the table names one by one
FETCH alter_cursor INTO v_table_name;
-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;
IF v_table_name != '' THEN
IF v_message = 'No records' THEN
SET v_message = '';
END IF;
-- This technic makes the trick, it prepares a statement
-- that is based on the v_table_name parameter and it means
-- that this one is different by each iteration inside the loop
SET @s = CONCAT('ALTER TABLE ',v_table_name,
' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_message = CONCAT('The table ', v_table_name ,
' was changed to the default collation of ', character_set,
'.\n', v_message);
SET v_table_name = '';
END IF;
-- Close the loop and the cursor
END LOOP get_table;
CLOSE alter_cursor;
-- Returns information about the altered tables or 'No records'
SELECT v_message;
END $$
DELIMITER ;
Setelah prosedur ini dibuat menyebutnya hanya:
CALL changeCollation('utf8');
Untuk lebih jelasnya baca ini blog.
Aku digunakan berikut shell script. Ini mengambil nama database sebagai parameter dan mengubah semua tabel lain charset dan pemeriksaan (diberikan oleh yang lain parameter atau nilai default yang ditentukan dalam naskah).
#!/bin/bash
# mycollate.sh <database> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables
DB="$1"
CHARSET="$2"
COLL="$3"
[ -n "$DB" ] || exit 1
[ -n "$CHARSET" ] || CHARSET="utf8mb4"
[ -n "$COLL" ] || COLL="utf8mb4_general_ci"
echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql
echo "USE $DB; SHOW TABLES;" | mysql -s | (
while read TABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
done
)
Hanya menjalankan SQL ini. Mengubah PEMERIKSAAN dengan apa yang anda butuhkan dan databaseName.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";
Solusi saya adalah kombinasi dari @Dzintars dan @Quassnoi Menjawab.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"
AND TABLE_TYPE="BASE TABLE";
Dengan menggunakan MENGKONVERSI
, ini menghasilkan script, yang mengubah semua Tabel dari <anda-database>
anda diminta encoding. Ini juga perubahan pengkodean setiap kolom!
Baik varian untuk menghasilkan script SQL melalui SQL permintaan. Itu tidak akan merusak default/nulls.
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.column_type,
' CHARACTER SET utf8 COLLATE utf8_general_ci',
if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
';'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'your_table_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');