ฉันมีทางออกที่จะแปลงฐานข้อมูลและตารางโดยใช้คำสั่งไม่กี่คำ นอกจากนี้ยังแปลงคอลัมน์ทุกชนิดvarchar
, text
, tinytext
, mediumtext
, ,longtext
char
คุณควรสำรองฐานข้อมูลของคุณในกรณีที่มีข้อผิดพลาดเกิดขึ้น
คัดลอกรหัสต่อไปนี้ลงในไฟล์ชื่อ preAlterTables.sql:
use information_schema;
SELECT concat("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as _sql
FROM `TABLES` where table_schema like "yourDbName" group by table_schema, table_name;
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('varchar','char');
SELECT concat("ALTER TABLE `",table_schema,"`.`",table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") as _sql
FROM `COLUMNS` where table_schema like "yourDbName" and data_type in ('text','tinytext','mediumtext','longtext');
แทนที่ "yourDbName" ที่เกิดขึ้นทั้งหมดด้วยฐานข้อมูลที่คุณต้องการแปลง จากนั้นเรียกใช้:
mysql -uroot < preAlterTables.sql | egrep '^ALTER' > alterTables.sql
สิ่งนี้จะสร้างไฟล์ใหม่ alterTables.sql พร้อมกับเคียวรีทั้งหมดที่คุณต้องการแปลงฐานข้อมูล เรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มการแปลง:
mysql -uroot < alterTables.sql
คุณยังสามารถปรับใช้สิ่งนี้เพื่อทำงานผ่านหลายฐานข้อมูลโดยการเปลี่ยนเงื่อนไขสำหรับ table_schema ยกตัวอย่างเช่นจะแปลงฐานข้อมูลทั้งหมดที่มีคำนำหน้าชื่อtable_schema like "wiki_%"
การแปลงฐานข้อมูลทั้งหมดเปลี่ยนสภาพด้วยwiki_
table_type!='SYSTEM VIEW'
ปัญหาที่อาจเกิดขึ้น ฉันมี varchar (255) คอลัมน์ในคีย์ mysql สิ่งนี้ทำให้เกิดข้อผิดพลาด:
ERROR 1071 (42000) at line 2229: Specified key was too long; max key length is 767 bytes
หากสิ่งนั้นเกิดขึ้นคุณสามารถเปลี่ยนคอลัมน์ให้เล็กลงเช่น varchar (150) และรันคำสั่งอีกครั้ง
โปรดทราบ : คำตอบนี้แปลงฐานข้อมูลเป็นutf8mb4_unicode_ci
แทนที่จะutf8mb4_bin
ถามในคำถาม แต่คุณสามารถแทนที่สิ่งนี้ได้
mysql -uroot -pThatrootPassWord < alterTables.sql
งาน และตามที่คุณได้กล่าวมาแล้ว utf8mb4_bin คือสิ่งที่กลุ่มคนอื่น ๆ แนะนำต่อไปขอแนะนำ