Saya berkontribusi di sini, seperti yang diminta OP:
Bagaimana cara mengubah susunan basis data, tabel, kolom?
Jawaban yang dipilih hanya menyatakannya di tingkat tabel.
Mengubah luas basis data:
ALTERDATABASE<database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Mengubahnya per tabel:
ALTERTABLE<table_name>CONVERTTO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Praktik yang baik adalah mengubahnya di level tabel karena itu akan mengubahnya untuk kolom juga. Mengubah kolom tertentu adalah untuk setiap kasus spesifik.
Mengubah susunan untuk kolom tertentu:
ALTERTABLE<table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Yang ini sebenarnya menjawab pertanyaan secara langsung. Saya membutuhkan ini, karena perubahan tingkat tabel saya TIDAK memperbarui kolom. Saya akan menyelidiki itu nanti; tetapi ini adalah informasi yang membuat saya melewati masa-masa sulit. Terima kasih.
Parapluie
9
Jawaban terbaik untuk ini.
jubi4dition
Ya, Anda perlu menentukan jenis kolom. Ini adalah perintah ajaib untuk mendapatkan semua tipe. Menggunakan pengeditan multi-baris Anda dapat membuat perintah untuk memperbarui semua kolom sekaligus mulai di sini:SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
William Entriken
Untuk satu kolom, Anda cukup melakukan: ALTER TABLE table_name CHANGE column_name VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68
Anda dapat menjalankan skrip 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 susunan untuk tabel secara individual yang dapat Anda gunakan,
ALTERTABLE mytable CONVERTTO CHARACTER SET utf8
Untuk mengatur susunan default untuk seluruh database,
ALTERDATABASE`databasename`DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
atau,
Goto PhpMyAdmin-> Operations-> Collation.
Di sana Anda menemukan kotak pilih yang berisi semua koleksi yang ada. Sehingga di sini Anda dapat mengubah susunan Anda. Jadi di sini setelah tabel database akan mengikuti pemeriksaan ini saat Anda membuat kolom baru. Tidak perlu memilih collation saat membuat kolom baru.
Kueri berikut akan menghasilkan kueri ALTER yang mengubah susunan untuk semua kolom yang sesuai di semua tabel ke tipe tertentu (utf8_general_ci dalam contoh saya di bawah).
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 ISNOTNULLAND
t1.COLLATION_NAME NOTIN('utf8_general_ci');
+1 Saya paling suka jawaban ini. Tidak semua orang memiliki PHP di suatu tempat secara ajaib. Beberapa penggunaan menggunakan bahasa lain dengan MySQL. Ini mudah dijalankan di MySQL Workbench, salin baris dan tempel. Saya baru saja melakukan langkah ekstra untuk menjalankan information_schema.tableskode di atas dan dalam concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
Ini bug pada jenis kolom teks (sedang / panjang), yang harus dibersihkan secara manual
stiebrs
11
Jika Anda menjalankan phpMyAdmin >> pilih database >> pilih tabel >> buka tab "Operations" >> di bagian "Table options" >> Anda dapat memilih Collation dari daftar drop-down >> dan setelah Anda menekan {Go} di bagian di atas layar Anda akan melihat pesan:
Permintaan SQL Anda telah berhasil dijalankan
dan sebuah skrip
ALTERTABLE`tableName`CONVERTTO CHARACTER SET utf8 COLLATE utf8_general_ci
Tapi itu TIDAK akan mengubah susunan kolom yang ada. Untuk melakukannya, Anda dapat menggunakan skrip ini (skrip ini juga berasal dari phpMyAdmin)
ALTERTABLE`tableName` CHANGE `Name``Name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOTNULL
Anda dapat mengubah CHARSET dan COLLATION dari semua tabel Anda melalui skrip PHP sebagai berikut. Saya suka jawaban hkasera tetapi masalahnya adalah bahwa kueri berjalan dua kali pada setiap tabel. Kode ini hampir sama kecuali menggunakan MySqli bukan mysql dan pencegahan permintaan ganda. Jika saya bisa memilih, saya akan memilih jawaban hkasera.
<?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();?>
Ini bekerja untuk saya dengan sempurna, setelah upgrade ke Zabbix 5. Hanya untuk mengatakan bahwa saya mengubah Charset dan Kolasi seperti ini: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4
Anda dapat menambahkan kode ini ke file skrip
//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!";
Saya terkejut mengetahui, dan jadi saya harus kembali ke sini dan melaporkan, bahwa Interkoneksi yang sangat baik dan terawat / itu AMAN PENCARIAN DAN PENGGANTIAN PADA skrip DATABASE memiliki beberapa opsi untuk mengonversi tabel ke utf8 / unicode, dan bahkan untuk mengkonversi ke innodb . Ini adalah skrip yang biasa digunakan untuk memigrasi situs web berbasis database (Wordpress, Drupal, Joomla, dll) dari satu domain ke domain lain.
Saya membacanya di sini, bahwa Anda perlu mengkonversi setiap tabel secara manual, itu tidak benar. Berikut ini adalah solusi bagaimana melakukannya dengan prosedur tersimpan:
DELIMITER $$DROPPROCEDUREIFEXISTS changeCollation$$-- character_set parameter could be 'utf8'-- or 'latin1' or any other valid character setCREATEPROCEDURE changeCollation(IN character_set VARCHAR(255))BEGINDECLARE v_finished INTEGER DEFAULT0;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 parameterDECLARE alter_cursor CURSORFORSELECTDISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =DATABASE()AND COLLATION_NAME NOTLIKE CONCAT(character_set,'_%');-- This handler will set the value v_finished to 1-- if there are no more rowsDECLARECONTINUE HANDLER
FORNOT 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 oneFETCH alter_cursor INTO v_table_name;-- If there is no more record, then we have to skip-- the commands inside the loopIF v_finished =1THEN
LEAVE get_table;ENDIF;IF v_table_name !=''THENIF v_message ='No records'THENSET v_message ='';ENDIF;-- 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 loopSET@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 ='';ENDIF;-- Close the loop and the cursorEND LOOP get_table;CLOSE alter_cursor;-- Returns information about the altered tables or 'No records'SELECT v_message;END$$
DELIMITER ;
Saya menggunakan skrip shell berikut. Dibutuhkan nama database sebagai parameter dan mengonversi semua tabel ke charset dan collation lain (diberikan oleh parameter lain atau nilai default yang ditentukan dalam skrip).
#!/bin/bash
# mycollate.sh <database>[<charset><collation>]# changes MySQL/MariaDB charset and collation for one database-all tables and#all columns inall tables
DB="$1"
CHARSET="$2"
COLL="$3"[-n "$DB"]||exit1[-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 |(whilereadTABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;"| mysql $DB
done
)
Solusi saya adalah kombinasi dari @Dzintars dan @Quassnoi Answer.
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 CONVERT TO, ini menghasilkan skrip, yang mengubah semua Tabel dari <your-database>ke pengkodean yang Anda minta. Ini juga mengubah penyandian setiap kolom !
Cara cepat - ekspor ke file SQL, gunakan pencarian dan ganti untuk mengubah teks yang perlu Anda ubah. Buat database baru, impor data dan kemudian ganti nama database lama dan yang baru dengan nama lama.
Untuk mengubah susunan semua bidang dalam semua tabel database sekaligus:
Saya baru saja menambahkan loop lain untuk bidang dalam tabel ke solusi melalui Php sebelum disebutkan. Ini membantu, semua bidang dalam tabel juga dikonversi.
<?php
$con = mysql_connect('localhost','user','pw');if(!$con){ echo "Cannot connect to the database ";die();}
mysql_select_db('database_name');$result=mysql_query('show tables');while($tables = mysql_fetch_array($result)){
foreach ($tables as$key=>$table){//for each table$sql ="ALTER TABLE $table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
echo "\n".$sql;
mysql_query($sql);$sql ="show fields in ".$table." where type like 'varchar%' or type like 'char%' or type='text' or type='mediumtext';";$rs2=mysql_query($sql);while($rw2 = mysql_fetch_array($rs2)){//for each field intable$sql ="ALTER TABLE `".$table."` CHANGE `".$rw2['Field']."` `".$rw2['Field']."` ".$rw2['Type']." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
echo "\n".$sql;
mysql_query($sql);}}}
echo "The collation of your database has been successfully changed!";?>}
Jawaban:
Anda perlu mengonversi setiap tabel secara individual:
(ini akan mengonversi kolom juga), atau ekspor database dengan
latin1
dan impor kembali denganutf8mb4
.sumber
@rsensan
:CONVERT
akan mengubah susunan kolom juga.database
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;MYTABLE
CONVERT KE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Tolong jangan gunakan utf8_general_ci lagi ;-)Saya berkontribusi di sini, seperti yang diminta OP:
Jawaban yang dipilih hanya menyatakannya di tingkat tabel.
Mengubah luas basis data:
Mengubahnya per tabel:
Praktik yang baik adalah mengubahnya di level tabel karena itu akan mengubahnya untuk kolom juga. Mengubah kolom tertentu adalah untuk setiap kasus spesifik.
Mengubah susunan untuk kolom tertentu:
sumber
SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
Anda dapat menjalankan skrip php.
sumber
Untuk mengubah susunan untuk tabel secara individual yang dapat Anda gunakan,
Untuk mengatur susunan default untuk seluruh database,
atau,
Goto PhpMyAdmin-> Operations-> Collation.
Di sana Anda menemukan kotak pilih yang berisi semua koleksi yang ada. Sehingga di sini Anda dapat mengubah susunan Anda. Jadi di sini setelah tabel database akan mengikuti pemeriksaan ini saat Anda membuat kolom baru. Tidak perlu memilih collation saat membuat kolom baru.
sumber
Kueri berikut akan menghasilkan kueri ALTER yang mengubah susunan untuk semua kolom yang sesuai di semua tabel ke tipe tertentu (utf8_general_ci dalam contoh saya di bawah).
sumber
information_schema.tables
kode di atas dan dalam concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Jika Anda menjalankan phpMyAdmin >> pilih database >> pilih tabel >> buka tab "Operations" >> di bagian "Table options" >> Anda dapat memilih Collation dari daftar drop-down >> dan setelah Anda menekan {Go} di bagian di atas layar Anda akan melihat pesan:
dan sebuah skrip
Tapi itu TIDAK akan mengubah susunan kolom yang ada. Untuk melakukannya, Anda dapat menggunakan skrip ini (skrip ini juga berasal dari phpMyAdmin)
sumber
Anda dapat mengatur susunan standar di beberapa tingkatan:
http://dev.mysql.com/doc/refman/5.0/id/charset-syntax.html
1) klien 2) standar server 3) standar basis data 4) standar tabel 5) kolom
sumber
Jalankan saja SQL ini untuk mengonversi semua tabel database sekaligus. Ubah COLLATION dan DatabaseName Anda dengan yang Anda butuhkan.
sumber
Anda dapat mengubah CHARSET dan COLLATION dari semua tabel Anda melalui skrip PHP sebagai berikut. Saya suka jawaban hkasera tetapi masalahnya adalah bahwa kueri berjalan dua kali pada setiap tabel. Kode ini hampir sama kecuali menggunakan MySqli bukan mysql dan pencegahan permintaan ganda. Jika saya bisa memilih, saya akan memilih jawaban hkasera.
sumber
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.Anda dapat menambahkan kode ini ke file skrip
sumber
Saya terkejut mengetahui, dan jadi saya harus kembali ke sini dan melaporkan, bahwa Interkoneksi yang sangat baik dan terawat / itu AMAN PENCARIAN DAN PENGGANTIAN PADA skrip DATABASE memiliki beberapa opsi untuk mengonversi tabel ke utf8 / unicode, dan bahkan untuk mengkonversi ke innodb . Ini adalah skrip yang biasa digunakan untuk memigrasi situs web berbasis database (Wordpress, Drupal, Joomla, dll) dari satu domain ke domain lain.
sumber
Saya membacanya di sini, bahwa Anda perlu mengkonversi setiap tabel secara manual, itu tidak benar. Berikut ini adalah solusi bagaimana melakukannya dengan prosedur tersimpan:
Setelah prosedur dibuat, panggil saja:
Untuk lebih jelasnya baca blog ini .
sumber
jika Anda ingin memperbarui charset default pada skema:
sumber
Saya menggunakan skrip shell berikut. Dibutuhkan nama database sebagai parameter dan mengonversi semua tabel ke charset dan collation lain (diberikan oleh parameter lain atau nilai default yang ditentukan dalam skrip).
sumber
Solusi saya adalah kombinasi dari @Dzintars dan @Quassnoi Answer.
Dengan menggunakan
CONVERT TO
, ini menghasilkan skrip, yang mengubah semua Tabel dari<your-database>
ke pengkodean yang Anda minta. Ini juga mengubah penyandian setiap kolom !sumber
Varian yang lebih baik untuk menghasilkan skrip SQL dengan permintaan SQL. Itu tidak akan merusak default / nulls.
sumber
Cara cepat - ekspor ke file SQL, gunakan pencarian dan ganti untuk mengubah teks yang perlu Anda ubah. Buat database baru, impor data dan kemudian ganti nama database lama dan yang baru dengan nama lama.
sumber
Untuk mengubah susunan semua bidang dalam semua tabel database sekaligus:
Saya baru saja menambahkan loop lain untuk bidang dalam tabel ke solusi melalui Php sebelum disebutkan. Ini membantu, semua bidang dalam tabel juga dikonversi.
sumber
Saya baru saja menulis skrip bash untuk menemukan semua tabel dalam database yang diberikan dan menyamarkannya (dan kolomnya).
Skrip tersedia di sini: https://github.com/Juddling/mysql-charset
sumber