การแปลง Encoding ข้อมูลภาษาไทยที่มีอยู่แล้ว มีความเสี่ยงสูงที่ภาษาจะกลายเป็น “ตัวยุ่ง”, “เต้าหู้” หรือ “ภาษาต่างดาว” หากทำผิดขั้นตอน
วิธีที่ปลอดภัยที่สุดคือการใช้คำสั่ง 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; - รันคำสั่งแปลงข้อมูล
ใช้คำสั่งด้านล่างนี้เพื่อเปลี่ยนทั้ง Database หรือเฉพาะตารางที่ต้องการALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
หมายเหตุ: การใช้ CONVERT TO จะแตกต่างจาก MODIFY ปกติ เพราะมันจะพยายาม Map รหัสตัวอักษรจากชุดเก่าไปชุดใหม่ให้โดยอัตโนมัติ
เทคนิคป้องกัน “ภาษาต่างดาว”
บ่อยครั้งที่ปัญหาไม่ได้เกิดจาก Database แต่เกิดจาก Connection ครับ หลังจากแปลง Database เสร็จแล้ว ใน Code ของแอปพลิเคชัน ต้องระบุการเชื่อมต่อเป็น UTF-8 เสมอ
- PHP
$pdo = new PDO ("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass) ; - การ Query ตรงๆ: ให้รันคำสั่ง
SET NAMES 'utf8mb4';
ทันทีหลังเชื่อมต่อสำเร็จ
กรณีที่ “พังไปแล้ว”
ถ้าข้อมูลในตารางอ่านไม่ออกตั้งแต่แรก แสดงว่าเกิดการเก็บข้อมูลแบบผิด Format วิธีแก้จะยากกว่าปกติ คือต้องแปลงกลับเป็น binary ก่อนแล้วค่อยแปลงเป็น utf8mb4 อีกครั้ง
-- ตัวอย่างการแก้ Column ที่พัง
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name TEXT CHARACTER SET utf8mb4;
วิธีนี้เป็นการล้าง “ป้ายกำกับ” ของภาษาเดิมออกแล้วแปะป้ายใหม่เข้าไปโดยไม่ยุ่งกับเนื้อ Binary
คำเตือน: หากตารางของคุณมีขนาดใหญ่มาก การรัน ALTER TABLE อาจทำให้ตาราง Lock และใช้เวลานาน ควรทำในช่วงที่ไม่มีคนใช้งานเว็บไซต์ครับ
อ่านเพิ่มเติม