WPML

ชุดอักขระและ 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.5latin1latin1_swedish_ciไม่
5.5.xutf8utf8_general_ciไม่
5.7+utf8mb4utf8mb4_general_ci / utf8mb4_unicode_ciใช่
8.0+utf8mb4utf8mb4_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

  1. ไปที่ฐานข้อมูลของเว็บไซต์คุณ
  2. ตรวจสอบคอลัมน์ "Collation" ที่อยู่ถัดจากแต่ละตาราง
  3. คลิกที่ตารางเพื่อดู 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 จะปฏิเสธหรือทำให้เกิดข้อผิดพลาด