ป้ายกำกับ: tis620

MariaDB: การแปลง EncodingMariaDB: การแปลง Encoding

การแปลง Encoding ข้อมูลภาษาไทยที่มีอยู่แล้ว ( เช่น จาก tis620 หรือ latin1 ไปเป็น utf8mb4 ) มีความเสี่ยงสูงที่ภาษาจะกลายเป็น “ตัวยุ่ง”, “เต้าหู้” หรือ “ภาษาต่างดาว” หากทำผิดขั้นตอน

วิธีที่ปลอดภัยที่สุดคือการใช้คำสั่ง CONVERT TO ของ MariaDB โดยตรง ซึ่งจะทำการแปลงทั้ง Character Set ของตาราง และ Data ที่อยู่ข้างในให้เป็น Format ใหม่ในขั้นตอนเดียวครับ


ขั้นตอนการแปลงที่ปลอดภัย

  1. Backup ข้อมูล ( สำคัญที่สุด )
    ก่อนรันคำสั่งใด ๆ ให้ทำการ Export ข้อมูลเดิมออกมาเก็บไว้ก่อน เพื่อป้องกันความผิดพลาดครับ
    mysqldump -u username -p database_name > backup_before_convert.sql
  2. ตรวจสอบสถานะปัจจุบัน
    เช็คก่อนว่าตารางของคุณใช้ Encoding อะไรอยู่
    SHOW CREATE TABLE table_name;
  3. รันคำสั่งแปลงข้อมูล ( 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 และใช้เวลานาน ควรทำในช่วงที่ไม่มีคนใช้งานเว็บไซต์ครับ


อ่านเพิ่มเติม