ชุดอักขระและ Collation ใน MySQL คืออะไร
เมื่อ WordPress จัดเก็บเนื้อหาเว็บไซต์ของคุณในฐานข้อมูล (เช่น โพสต์ ชื่อเรื่อง สตริงที่แปล ฯลฯ) ระบบจะใช้ชุดอักขระเพื่อแสดงอักขระ และใช้ Collation เพื่อกำหนดวิธีการเปรียบเทียบและจัดเรียงอักขระเหล่านั้น
- ชุดอักขระ (Charset)
- กำหนดวิธีการจัดเก็บอักขระในฐานข้อมูล ซึ่งโดยพื้นฐานแล้วคือการกำหนดว่าไบต์ใดแสดงถึงอักขระใด
- Collation
- กำหนดกฎสำหรับการเปรียบเทียบอักขระเหล่านั้น (เช่น การแยกแยะตัวพิมพ์เล็กพิมพ์ใหญ่ การแยกแยะเครื่องหมายเน้นเสียง และลำดับการจัดเรียง)
เหตุใดจึงสำคัญสำหรับเว็บไซต์หลายภาษา
WPML รองรับเนื้อหาหลายภาษา ซึ่งมักจะประกอบด้วย:
- อักขระพิเศษ (เช่น ñ, é, ö)
- อักษรที่ไม่ใช่ละติน (เช่น อาหรับ ญี่ปุ่น จีน ฮีบรู)
- อีโมจิและสัญลักษณ์ (🎉, ✔️ ฯลฯ)
อักขระเหล่านี้หลายตัวต้องใช้พื้นที่มากกว่า 3 ไบต์ในการจัดเก็บอย่างถูกต้อง หากฐานข้อมูลของคุณใช้ Collation ที่ไม่เข้ากัน อักขระอาจสูญหาย ถูกแทนที่ด้วยเครื่องหมายคำถาม หรือทำให้เกิดข้อผิดพลาดของฐานข้อมูล (เช่น "Incorrect string value")
นั่นคือเหตุผลที่เราขอแนะนำอย่างยิ่งให้ใช้ Collation ที่รองรับอักขระ Unicode แบบ 4 ไบต์
คำแนะนำของเรา
ใช้ชุดอักขระ utf8mb4 และ Collation ที่เข้ากันได้กับ Unicode เช่น:
- utf8mb4_unicode_ci – เข้ากันได้ในวงกว้าง เป็นค่าเริ่มต้นที่ดี
- utf8mb4_unicode_520_ci – จัดการ Unicode ได้ดีกว่าใน MySQL 5.6+
- utf8mb4_general_ci – เร็วกว่าเล็กน้อย แต่การเปรียบเทียบ Unicode แม่นยำน้อยกว่า
- utf8mb4_bin – แยกแยะตัวพิมพ์เล็กพิมพ์ใหญ่และเครื่องหมายเน้นเสียง (การเปรียบเทียบแบบไบนารี)
ทั้งหมดนี้สามารถใช้งานร่วมกับ WPML ได้อย่างปลอดภัย
สำคัญ: ชุดอักขระ utf8 แบบเก่าใน MySQL รองรับอักขระสูงสุดเพียง 3 ไบต์เท่านั้น ซึ่งไม่สามารถจัดการอักขระบางตัว เช่น อีโมจิหรืออักษรภาพบางตัวได้ โปรดหลีกเลี่ยงการใช้ชุดอักขระนี้สำหรับเนื้อหาหลายภาษา
ค่าเริ่มต้นใน MySQL คืออะไร
| เวอร์ชัน MySQL | ชุดอักขระเริ่มต้น | Collation เริ่มต้น | เข้ากันได้กับ Unicode |
|---|---|---|---|
| < 5.5 | latin1 | latin1_swedish_ci | ไม่ |
| 5.5.x | utf8 | utf8_general_ci | ไม่ |
| 5.7+ | utf8mb4 | utf8mb4_general_ci / utf8mb4_unicode_ci | ใช่ |
| 8.0+ | utf8mb4 | utf8mb4_0900_ai_ci | ใช่ |
WordPress อาจไม่ได้ใช้ค่าเริ่มต้นของ MySQL เสมอไป เนื่องจากสามารถแทนที่ค่าดังกล่าวได้ผ่านการกำหนดค่าหรือการย้ายข้อมูล
การตั้งค่าชุดอักขระและ Collation สำหรับเว็บไซต์ใหม่
เพื่อให้แน่ใจว่า WordPress จะสร้างตารางใหม่ด้วยชุดอักขระและ Collation ที่ถูกต้อง ให้กำหนดค่าต่อไปนี้ใน wp-config.php ของคุณ:
define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4 define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
การดำเนินการนี้จะมีผลกับการติดตั้งใหม่และตารางที่สร้างขึ้นใหม่
การตรวจสอบชุดอักขระและ Collation สำหรับเว็บไซต์และตารางที่มีอยู่
ต่อไปนี้คือวิธีตรวจสอบชุดอักขระและ Collation บนเว็บไซต์ที่มีอยู่ของคุณ
ตัวเลือกที่ 1 phpMyAdmin
- ไปที่ฐานข้อมูลของเว็บไซต์คุณ
- ตรวจสอบคอลัมน์ "Collation" ที่อยู่ถัดจากแต่ละตาราง
- คลิกที่ตารางเพื่อดู Collation ของแต่ละคอลัมน์
ตัวเลือกที่ 2 WP-CLI
bash
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"
คุณยังสามารถตรวจสอบแต่ละคอลัมน์ได้ด้วย:
bash
wp db query "SHOW FULL COLUMNS FROM wp_posts;"
หากคุณเห็นว่า Collation ขึ้นต้นด้วย utf8mb4_ แสดงว่าพร้อมรองรับ Unicode ทุกประเภทและอักษรภาพแบบ 4 ไบต์แล้ว ชุดอักขระก็ใช้ได้เช่นกัน
หากคุณเห็นเป็นอย่างอื่น เช่น utf8_* คุณจะต้องทำการเปลี่ยนแปลง
โปรดทราบว่า Collation อาจแตกต่างกันไปในแต่ละคอลัมน์
การอัปเดตชุดอักขระและ Collation สำหรับตารางและคอลัมน์ที่มีอยู่
การอัปเดตค่าคงที่ DB_CHARSET และ DB_COLLATE ในไฟล์ wp-config.php ของคุณจะมีผลกับตารางใหม่เท่านั้น หากต้องการใช้การเปลี่ยนแปลงกับตารางและคอลัมน์ที่มีอยู่ คุณต้องแปลงข้อมูลด้วยตนเองโดยใช้ SQL
เราขอแนะนำให้อัปเดต Collation เริ่มต้นของ MySQL สำหรับฐานข้อมูลโดยใช้คำสั่งต่อไปนี้:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
เริ่มต้นด้วยการสำรองข้อมูลเสมอ
ก่อนเรียกใช้คิวรีการแปลงใด ๆ:
- ส่งออกฐานข้อมูลของคุณโดยใช้ phpMyAdmin หรือ mysqldump
- จัดเก็บไว้อย่างปลอดภัยในกรณีที่เกิดข้อผิดพลาด
คำเตือน: การอัปเดต Collation อาจล้มเหลวภายใต้โหมด Strict
เมื่ออัปเดต Collation ของทั้งตาราง (หรือฐานข้อมูล) MySQL อาจสร้างตารางใหม่และตรวจสอบค่าเริ่มต้นของคอลัมน์ทั้งหมดอีกครั้ง รวมถึงคอลัมน์ที่ไม่เกี่ยวข้องอย่าง DATETIME ด้วย หากฐานข้อมูลของคุณทำงานในโหมด Strict SQL (STRICT_TRANS_TABLES, NO_ZERO_DATE) คอลัมน์ที่มีค่าเริ่มต้นเช่น '0000-00-00 00:00:00' จะทำให้เกิดข้อผิดพลาด เช่น:
#1067 - Invalid default value.
โหมด Strict คืออะไร
โหมด Strict จะควบคุมวิธีที่ MySQL จัดการกับค่าที่ไม่ถูกต้องหรือขาดหายไปเมื่อมีการเพิ่มหรืออัปเดตข้อมูลลงในฐานข้อมูล ค่าอาจไม่ถูกต้องได้จากหลายสาเหตุ ตัวอย่างเช่น อาจมีประเภทข้อมูลที่ไม่ถูกต้องสำหรับคอลัมน์นั้น หรืออาจอยู่นอกช่วงที่กำหนด
คุณสามารถค้นหาข้อมูลเกี่ยวกับประเภทการตรวจสอบข้อมูลต่าง ๆ สำหรับโหมด Strict ได้ในเอกสารประกอบของ MySQL
โหมด Strict ส่งผลต่อฐานข้อมูลเว็บไซต์ WordPress อย่างไร
ตามค่าเริ่มต้น WordPress จะใช้ '0000-00-00 00:00:00' เป็นค่าเริ่มต้นสำหรับคอลัมน์ datetime บางคอลัมน์ ซึ่งโหมด Strict แบบ NO_ZERO_DATE จะไม่ยอมรับ
โปรดทราบว่าค่าเริ่มต้นเหล่านี้ได้รับอนุญาตในระหว่างการสร้างตารางดั้งเดิม (เช่น ระหว่างการตั้งค่า WordPress) แต่จะล้มเหลวเมื่อมีการดำเนินการ ALTER ในสภาพแวดล้อมแบบ Strict
วิธีตรวจสอบว่ามีการเปิดใช้งานโหมด Strict หรือไม่
เรียกใช้คำสั่งต่อไปนี้:
SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;
มองหา:
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_DATE
หากคุณพบสิ่งเหล่านี้ แสดงว่ามีการเปิดใช้งานโหมด Strict
เพื่อหลีกเลี่ยงข้อผิดพลาดระหว่างการอัปเดตชุดอักขระและ Collation คุณเพียงแค่ต้องปิดการใช้งานโหมด Strict แบบ NO_ZERO_DATE เท่านั้น
วิธีดำเนินการอย่างปลอดภัย
ดำเนินการตามวิธีใดวิธีหนึ่งต่อไปนี้เพื่อความปลอดภัย:
1. หลีกเลี่ยงการแก้ไขคอลัมน์และตาราง เว้นแต่ว่า Collation จำเป็นต้องเปลี่ยนแปลงจริง ๆ
2. ปิดการใช้งานโหมด Strict ชั่วคราวสำหรับเซสชันนี้เท่านั้นในขณะที่เรียกใช้คิวรีการแปลง คุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้:
SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');
หมายเหตุ: MySQL มีแผนในอนาคตที่จะรวมโหมด Strict เข้าด้วยกัน
ในกรณีที่เกิดปัญหาอื่น ๆ เฉพาะกับข้อมูลของคุณ คุณอาจต้องปิดการใช้งานโหมด Strict ใด ๆ โดยใช้คำสั่งต่อไปนี้:
SET SESSION sql_mode = '';
คิวรีสำหรับการแปลงข้อมูล
แปลงทั้งฐานข้อมูล
คำสั่งต่อไปนี้จะสร้างคิวรี ALTER TABLE สำหรับแต่ละตารางในฐานข้อมูลของคุณ:
SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) AS query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
เรียกใช้คิวรีที่ได้ใน phpMyAdmin หรือคัดลอกและวางลงใน MySQL CLI / WP-CLI
การดำเนินการนี้จะช่วยให้แน่ใจว่าตารางทั้งหมดในฐานข้อมูลของคุณใช้ชุดอักขระและ Collation ใหม่
แปลงตารางเฉพาะ ตัวเลือกเสริม
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
การดำเนินการนี้จะอัปเดตคอลัมน์ข้อความทั้งหมดในตาราง wp_posts ให้ใช้ utf8mb4 และ Collation ที่ระบุ
แปลงคอลัมน์เฉพาะ ตัวเลือกเสริม
ALTER TABLE wp_posts CHANGE post_title post_title TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
หมายเหตุ:
- คุณต้องประกาศคอลัมน์ใหม่ทั้งหมด (ประเภท ชื่อ) ใน CHANGE
- ตรวจสอบให้แน่ใจว่าประเภทคอลัมน์ตรงกับประเภทที่มีอยู่
ข้อผิดพลาดทั่วไปเมื่อทำการแปลง
ต่อไปนี้คือข้อผิดพลาดทั่วไปสองประการที่คุณอาจพบเมื่อทำการแปลงตารางและคอลัมน์
ชุดอักขระและ Collation ไม่ตรงกัน
-- INVALID: utf8 collation with utf8mb4 charset ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci; -- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
วิธีแก้ปัญหา:
- ใช้ Collation ที่ตรงกัน: utf8mb4_*
ขีดจำกัดความยาวของคีย์ดัชนี
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
ในการกำหนดค่าบางอย่าง โดยเฉพาะสำหรับ MySQL เวอร์ชันต่ำกว่า 5.7 ความยาวของคีย์ดัชนีอาจเกินขีดจำกัดสูงสุดเมื่อมีการเพิ่มจำนวนไบต์ต่ออักขระอีกหนึ่งไบต์
วิธีแก้ปัญหา:
- ลดขนาด VARCHAR(255) ที่ทำดัชนีไว้ให้สั้นลงเหลือ VARCHAR(191) หากจำเป็น
- หรืออัปเกรดเป็น MySQL 5.7+ และตรวจสอบให้แน่ใจว่าเปิดใช้งาน innodb_large_prefix แล้ว
สรุป
- ใช้ชุดอักขระ utf8mb4 เพื่อรองรับ Unicode อย่างเต็มรูปแบบ
- ใช้ Collation ที่เข้ากันได้: utf8mb4_unicode_ci, utf8mb4_0900_ai_ci ฯลฯ
- อัปเดต wp-config.php สำหรับตารางใหม่
- เรียกใช้การย้ายข้อมูล SQL เพื่อแก้ไขตารางที่มีอยู่
- ห้ามผสมชุดอักขระและ Collation เข้าด้วยกัน เนื่องจาก MySQL จะปฏิเสธหรือทำให้เกิดข้อผิดพลาด