หมวดหมู่: PHP

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

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

วิธีที่ปลอดภัยที่สุดคือการใช้คำสั่ง 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. รันคำสั่งแปลงข้อมูล
    ใช้คำสั่งด้านล่างนี้เพื่อเปลี่ยนทั้ง 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 และใช้เวลานาน ควรทำในช่วงที่ไม่มีคนใช้งานเว็บไซต์ครับ


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