หลังจากได้ปรับ WordPress ไปในรอบก่อน แล้วที่นี้เดือนที่แล้ว ผมได้ไปงาน Agile Thailand 2025 ตอนแรกตั้งใจว่าเดียวเอาจากที่ Note มาแปบเดียวแหละ เดี๋ยวสัก 5 ทุ่ม Publish Blog ปรากฏว่าหลังจากเขียนเสร็จ จะกด Save
เชี่ยอยู่ๆ ทำไมมาพังตอนนี้หวะเนี่ย หรือ จะเป็นเพราะขยับ WordPress ล่าสุดไป

อย่างแรกที่ผมทำนอนครับ ทำอะไรตอนมืนๆ อันตรายมาก แล้ววันรุ่งขึ้นมาดูต่อ เอา Post Copy แปะลง Notion สำรองไว้ก่อน แล้วกลับมาดูก่อนว่าเราทำอะไรไปบ้าง จดๆ Tune WordPress 2025
อ๋อเจอแล้ว ตัว WordPress เรายังใช้ Charset/Collation utf8mb3_general_ci แล้วที่นี้ใน Post ผมดันใส่ Emoji เข้าไป เห็นใน Facebook Post เค้าแปะกัน เราอยากแปะบ้าง 555
สรุปพังจากตรงนี้เลยครับ

ถ้าอยาก Save Emoji ลง DB ต้องใช้ Collation แบบไหน ?
ต้องปรับไปใช้ utf8mb4_xxx แทน โดยที่มันต่างกับ utf8mb3_xxx ดังนี้
- utf8mb3_xxx ใช้พื้นที่ 3 byte ในการเก็บข้อมูล
- utf8mb4_xxx ใช้พื้นที่ 4 byte ในการเก็บข้อมูล แน่นนอนครับ ถ้าปรับให้เก็บ Emoji ได้ ใช้พื้นที่ 4 byte ในการจัดเก็บ และก็ Required ว่าใช้ MySQL 5.5.3 ++ แต่อันนี้น่าจะผ่านมาหลายปีแล้ว เอาเป็น Check List นึงครับ
ตอนนี้เรารู้แน่ๆแล้วใช้ utf8mb4_xxx แล้ว xxx มันมีแบบไหนบ้างหละ หลังจากลองไปส่องใน DB WordPress ตัวเองจะมี 3 แบบ utf8mb4_general_ci / utf8mb4_unicode_ci / utf8mb4_unicode_520_ci แล้วมันต่างกันยังไง โดยหลักจะเป็นการรองรับภาษาต่างๆ และการเปรียบเทียบ จัดเรียงตัวอักษรครับ ผมเลยสรุปมาเป็นตารางไว้
Catagory | utf8mb4_general_ci | utf8mb4_unicode_ci | utf8mb4_unicode_520_ci |
---|---|---|---|
Unicode Standard | รองรับบางส่วน อาจจะมีบางภาษา ที่ตกหล่นไป | Unicode 4.0 | Unicode 5.2.0 |
Peformance | เร็วสุด | ช้ากว่า general_ci | ช้าที่สุด |
Sort / Compare | แบบง่าย | ซับซ้อนกว่า | ซับซ้อนที่สุด |
แล้วอีกมุม การเปรียบเทียบ จัดเรียงตัวอักษร
Sample | utf8mb4_general_ci | utf8mb4_unicode_ci | utf8mb4_unicode_520_ci |
---|---|---|---|
'café' vs 'cafe' | เท่ากัน | เท่ากัน | เท่ากัน |
'ß' vs 'ss' | เท่ากัน | ไม่เท่า | ไม่เท่า |
'æ' vs 'ae' | เท่ากัน | ไม่เท่า | ไม่เท่า |
Emoji Sorting | ไม่ถูก | ไม่ถูก | ถูกต้อง |
Emoji Sorting ตัว Emoji มีตัวเลขกำหนด บอกหมวดด้วย🔥 (Fire) - U+1F525 😀 (Grinning Face) - U+1F600 🍎 (Apple) - U+1F34E ⚡ (Lightning) - U+26A1 ถ้าให้ถูกมันต้องเรียงตามหมวด ไม่งั้นระบบเรียงตาม codepoint แทน
สำหรับผมที่ไม่ซีเรียสอะไร เอาแบบ utf8mb4_unicode_ci พอครับ
ต้องแก้ที่ไหน
สำหรับผมที่เป็น Blog เก่า มันมีทางแก้ 2 แบบ แก้เฉพาะ Column ที่มีปัญหา อยากเก็บ Emoji Scope จะเล็ก หรือ ปรับทั้ง Table ซึ่งมีปัญหาตามมานะ ผมเคยทำงานโดยใช้ MySQL / MariaDB เคยเจอปัญหาตอน Join แนวๆนี้
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='
ถ้าเขียน Query เอาไปปรับได้แหละ
SELECT * FROM table1 JOIN table2 ON table1.col1 COLLATE utf8mb4_unicode_ci = table2.col2 COLLATE utf8mb4_unicode_ci;
แต่จะไปทำเพื่ออะไรครับ ไหนปรับแล้ว ผมปรับทั้ง Table เอาที่มัน Join ด้วย สำหรับโครงสร้าง Table Core ของ WordPress ผมดูจากเอกสารสรุปของทางสมาคมโปรแกรมเมอร์ได้ทำไว้ครับ และทำ Script ปรับประมาณี้
ALTER TABLE wp_users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_usermeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_postmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_options CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_term_taxonomy CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_term_relationships CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_terms CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_termmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # ผมไม่ได้ปรับ ไม่ได้เปิดให้ Comment ALTER TABLE wp_comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE wp_commentmeta CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ถ้าใครอยากปรับราย Column ผมมีตัวอย่าง Script
ALTER TABLE wp_posts MODIFY post_title LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, MODIFY post_excerpt LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, MODIFY post_content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
จากนั้นลุยเลยครับ อย่าลืม Backup DB ก่อนนะครับ
อ๋อและอย่าลืมไปปรับ wp-config.php ให้ Table ใหม่ที่สร้างเป็น utf8mb4
define('DB_CHARSET', 'utf8mb4'); define('DB_COLLATE', '');
และมีเรื่องแปลกๆ ตอนต้น Blog ผมเขียนว่า utf8mb3_xxx ไปเป็น utf8mb4_unicode_ci มันใช้พื้นที่เพิ่มขึ้น แต่ Run จริง ดันน้อยกว่า อันนี้ผมตั้งสมมติฐานนะว่า มันได้ Rebuilt, optimized, bloat ออกไป อย่างพวก Row ที่ลบไปแล้ว ขอคืนพื้นที่กลับมาครับ

ผลใช้ได้ และผมรออีก 1 เดือน ลองใช้แล้ว Publish ปกติใช้งานได้
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.