เมื่อข้อมูลในฐานข้อมูลถูกเก็บด้วย character set ผิด (เช่น latin1 แทน utf8) ทำให้อักขระพิเศษแสดงผลผิด (เช่น ’ แทน ’) สามารถแก้ไขได้ด้วยฟังก์ชัน CONVERT() แบบ double conversion
รูปแบบคำสั่ง
SELECT CONVERT(BINARY CONVERT(column_name USING latin1) USING utf8) AS fixed_column
FROM table_name;
หลักการทำงาน (Double Conversion)
CONVERT(column_name USING latin1)- อ่านไบต์ดิบ (raw bytes) ว่าเป็น latin1BINARY- บังคับให้ถือเป็น binary string (ไม่แปลง character set)CONVERT(... USING utf8)- แปลง binary bytes นั้นเป็น utf8
วิธีนี้ใช้ได้เมื่อ: ข้อมูลจริงเป็น UTF-8 แต่ถูกเก็บในคอลัมน์ latin1 (double-encoded)
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูลที่เข้ารหัสผิด
CREATE TABLE UtfDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(15),
PRIMARY KEY (Id)
);
INSERT INTO UtfDemo (Name) VALUES
('Obama’s'), -- ควรเป็น Obama's
('John’s'), -- ควรเป็น John's
('Carol’s'), -- ควรเป็น Carol's
('Sam’s'); -- ควรเป็น Sam's
ข้อมูลแสดงผลผิด:
+----+----------------+
| Id | Name |
+----+----------------+
| 1 | Obama’s |
| 2 | John’s |
| 3 | Carol’s |
| 4 | Sam’s |
+----+----------------+
2. แปลงข้อมูลเป็น UTF-8
SELECT CONVERT(BINARY CONVERT(Name USING latin1) USING utf8) AS ListOfName
FROM UtfDemo;
ผลลัพธ์:
+------------+
| ListOfName |
+------------+
| Obama's |
| John's |
| Carol's |
| Sam's |
+------------+
แก้ไขถาวร (UPDATE ตาราง)
UPDATE UtfDemo
SET Name = CONVERT(BINARY CONVERT(Name USING latin1) USING utf8);
กรณีอื่น: ข้อมูลเป็น latin1 จริง ต้องการเป็น utf8
-- แปลงคอลัมน์โดยตรง (alter table)
ALTER TABLE table_name
MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- หรือแปลงทั้งตาราง
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ข้อสังเกตสำคัญ
- ใช้
utf8mb4แทนutf8(utf8 ใน MySQL เก่า = utf8mb3 รองรับแค่ 3 ไบต์ ไม่รองรับ emoji) - Backup ข้อมูลก่อนทำการแปลง
- ทดสอบด้วย SELECT ก่อน UPDATE จริง
- ตรวจสอบ character set ปัจจุบัน:
SHOW CREATE TABLE table_name
สรุป
ใช้ CONVERT(BINARY CONVERT(col USING latin1) USING utf8mb4) สำหรับกรณี double-encoding และ ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 สำหรับการเปลี่ยน character set อย่างถาวร