ป้ายกำกับ: utf8mb4

MariaDB: เช็ค Character Set และ CollationMariaDB: เช็ค Character Set และ Collation

คุณสามารถใช้ SQL Query ตรวจสอบผ่านตาราง information_schema ซึ่งเป็นสารบัญรวมข้อมูลทั้งหมดของ Database ในเครื่อง เพื่อหาว่ามี Table หรือ Column ไหนบ้างที่ยังไม่ได้ใช้ utf8mb4 ครับ


ตรวจสอบระดับ Table ( ดูภาพรวม )

Script นี้จะแสดงรายชื่อตารางทั้งหมดใน Database ที่คุณระบุ ซึ่งยังไม่ได้ตั้งค่าเป็น utf8mb4_unicode_ci

SELECT 
    TABLE_SCHEMA AS 'Database', 
    TABLE_NAME AS 'Table', 
    TABLE_COLLATION AS 'Current_Collation'
FROM 
    information_schema.TABLES 
WHERE 
    TABLE_SCHEMA = 'ชื่อ_database_ของคุณ' -- เปลี่ยนตรงนี้เป็นชื่อ DB
    AND TABLE_COLLATION != 'utf8mb4_unicode_ci';

ตรวจสอบระดับ Column ( ละเอียดที่สุด )

บางครั้งตัว Table เป็น utf8mb4 แล้ว แต่บาง Column อาจจะยังหลงเหลือเป็น latin1 หรือ tis620 อยู่ ( ซึ่งเป็นตัวการที่ทำให้ภาษาไทยพังบ่อยที่สุด ) ใช้ Script นี้เช็คครับ

SELECT 
    TABLE_NAME AS 'Table', 
    COLUMN_NAME AS 'Column', 
    CHARACTER_SET_NAME AS 'Char_Set', 
    COLLATION_NAME AS 'Collation',
    DATA_TYPE AS 'Data_Type'
FROM 
    information_schema.COLUMNS 
WHERE 
    TABLE_SCHEMA = 'ชื่อ_database_ของคุณ' -- เปลี่ยนตรงนี้เป็นชื่อ DB
    AND CHARACTER_SET_NAME IS NOT NULL -- กรองเฉพาะพวก Text/Varchar
    AND (CHARACTER_SET_NAME != 'utf8mb4' OR COLLATION_NAME != 'utf8mb4_unicode_ci');

Script ช่วยสร้างคำสั่ง ALTER ( สำหรับคนขี้เกียจพิมพ์ )

ถ้าคุณมีหลายตารางที่ต้องแก้ Script นี้จะช่วย Generate คำสั่ง SQL ออกมาให้คุณก๊อปปี้ไปรันได้เลยครับ

SELECT 
    CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, 
    ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS Execute_This_SQL
FROM 
    information_schema.TABLES 
WHERE 
    TABLE_SCHEMA = 'ชื่อ_database_ของคุณ' 
    AND TABLE_COLLATION != 'utf8mb4_unicode_ci';

ข้อควรระวังก่อนรันคำสั่งที่ได้จาก Script

  • Data Length: เมื่อเปลี่ยนจาก tis620 ( 1 byte ) หรือ utf8 ( 3 bytes ) เป็น utf8mb4 ( 4 bytes ) ขนาด Index ของ Column อาจจะเกินลิมิตที่ตั้งไว้ ( 767 bytes ในรุ่นเก่า ) หากเกิด Error คุณอาจต้องลดขนาดความยาวของ VARCHAR ลงเล็กน้อยครับ
  • Application Connection: อย่าลืมเช็คที่ตัว Code ของแอปพลิเคชันด้วยว่าเชื่อมต่อด้วย utf8mb4 หรือยัง เพราะถ้าใน DB เป็น UTF-8 แต่ Code ส่งมาแบบอื่น ข้อมูลที่เก็บลงไปก็จะเป็นภาษาต่างดาวอยู่ดีครับ

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