การแปลง Encoding ข้อมูลภาษาไทยที่มีอยู่แล้ว ( เช่น จาก tis620 หรือ latin1 ไปเป็น utf8mb4 ) มีความเสี่ยงสูงที่ภาษาจะกลายเป็น “ตัวยุ่ง”, “เต้าหู้” หรือ “ภาษาต่างดาว” หากทำผิดขั้นตอน
วิธีที่ปลอดภัยที่สุดคือการใช้คำสั่ง CONVERT TO ของ MariaDB โดยตรง ซึ่งจะทำการแปลงทั้ง Character Set ของตาราง และ Data ที่อยู่ข้างในให้เป็น Format ใหม่ในขั้นตอนเดียวครับ
ขั้นตอนการแปลงที่ปลอดภัย
- Backup ข้อมูล ( สำคัญที่สุด )
ก่อนรันคำสั่งใด ๆ ให้ทำการ Export ข้อมูลเดิมออกมาเก็บไว้ก่อน เพื่อป้องกันความผิดพลาดครับmysqldump -u username -p database_name > backup_before_convert.sql - ตรวจสอบสถานะปัจจุบัน
เช็คก่อนว่าตารางของคุณใช้ Encoding อะไรอยู่SHOW CREATE TABLE table_name; - รันคำสั่งแปลงข้อมูล ( The Magic Command )
ใช้คำสั่งด้านล่างนี้เพื่อเปลี่ยนทั้ง Database หรือเฉพาะตารางที่ต้องการALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
หมายเหตุ: การใช้ CONVERT TO จะแตกต่างจาก MODIFY ปกติ เพราะมันจะพยายาม Map รหัสตัวอักษรจากชุดเก่าไปชุดใหม่ให้โดยอัตโนมัติ
เทคนิคป้องกัน “ภาษาต่างดาว” ( Double Encoding )
บ่อยครั้งที่ปัญหาไม่ได้เกิดจาก Database แต่เกิดจาก Connection ครับ หลังจากแปลง Database เสร็จแล้ว ใน Code ของแอปพลิเคชัน ( PHP, Python, JS ) ต้องระบุการเชื่อมต่อเป็น UTF-8 เสมอ
- PHP ( PDO )
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass); - การ Query ตรงๆ: ให้รันคำสั่ง
SET NAMES 'utf8mb4';
ทันทีหลังเชื่อมต่อสำเร็จ
กรณีที่ “พังไปแล้ว” ( ข้อมูลใน DB อ่านไม่ออกอยู่แล้ว )
ถ้าข้อมูลในตารางอ่านไม่ออกตั้งแต่แรก ( เช่น เห็นเป็น à ¹ แทนที่จะเป็น เ ) แสดงว่าเกิดการเก็บข้อมูลแบบผิด Format ( Double Encoding ) วิธีแก้จะยากกว่าปกติ คือต้องแปลงกลับเป็น binary ก่อนแล้วค่อยแปลงเป็น utf8mb4 อีกครั้ง
-- ตัวอย่างการแก้ Column ที่พัง
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name TEXT CHARACTER SET utf8mb4;
วิธีนี้เป็นการล้าง “ป้ายกำกับ” ของภาษาเดิมออกแล้วแปะป้ายใหม่เข้าไปโดยไม่ยุ่งกับเนื้อ Binary
คำเตือน: หากตารางของคุณมีขนาดใหญ่มาก ( ระดับหลายล้าน Row ) การรัน ALTER TABLE อาจทำให้ตาราง Lock และใช้เวลานาน ควรทำในช่วงที่ไม่มีคนใช้งานเว็บไซต์ครับ
อ่านเพิ่มเติม