Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: แปลงข้อมูลที่เข้ารหัสผิด (Wrong Encoding) เป็น UTF-8 ด้วย CONVERT

เมื่อข้อมูลในฐานข้อมูลถูกเก็บด้วย 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)

  1. CONVERT(column_name USING latin1) - อ่านไบต์ดิบ (raw bytes) ว่าเป็น latin1
  2. BINARY - บังคับให้ถือเป็น binary string (ไม่แปลง character set)
  3. 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 อย่างถาวร