วิธีที่ปลอดภัยที่สุดคือการปรับเปลี่ยนคอลัมน์ให้เป็นประเภทไบนารีก่อนแล้วจึงปรับเปลี่ยนกลับไปเป็นประเภทอื่นโดยใช้ชุดอักขระที่ต้องการ
แต่ละประเภทคอลัมน์มีประเภทไบนารีตามลำดับดังนี้:
- CHAR => BINARY
- TEXT => BLOB
- TINYTEXT => TINYBLOB
- MEDIUMTEXT => MEDIUMBLOB
- LONGTEXT => LONGBLOB
- VARCHAR => VARBINARY
เช่น.:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;
ฉันลองในตาราง latin1 หลายอันและเก็บเครื่องหมายกำกับไว้ทั้งหมด
คุณสามารถแยกแบบสอบถามนี้สำหรับคอลัมน์ทั้งหมดที่ทำสิ่งนี้:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');
หลังจากที่คุณทำเช่นนี้ในทุกคอลัมน์แล้วคุณทำมันในตารางทั้งหมด:
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
เพื่อสร้างแบบสอบถามนี้สำหรับทุกตารางของคุณใช้แบบสอบถามต่อไปนี้:
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');
และตอนนี้คุณปรับเปลี่ยนคอลัมน์และตารางทั้งหมดของคุณแล้วให้ทำเช่นเดียวกันกับฐานข้อมูล:
ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
utf8_unicode_ci
utf8_general_ci