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