คู่มือการตรวจสอบและกำหนดค่าชุดอักขระ MySQL: อธิบายความแตกต่างระหว่าง utf8 กับ utf8mb4

目次

1. บทนำ

MySQL เป็นระบบจัดการฐานข้อมูลที่ได้รับการใช้งานอย่างกว้างขวางในแอปพลิเคชันต่าง ๆ ในบรรดาองค์ประกอบการกำหนดค่าต่าง ๆ การตั้งค่าชุดอักขระมีความสำคัญอย่างยิ่งเพราะมีผลโดยตรงต่อความสมบูรณ์ของข้อมูลและประสิทธิภาพ อย่างไรก็ตาม นักพัฒนาจำนวนมากพบปัญหาเนื่องจากไม่ได้รับข้อมูลครบถ้วนเกี่ยวกับวิธีการกำหนดค่าและตรวจสอบชุดอักขระอย่างถูกต้อง.

บทความนี้มุ่งเน้นที่วิธีการตรวจสอบการตั้งค่าชุดอักขระของ MySQL อธิบายวิธีการปรับเปลี่ยน ชี้แจงความแตกต่างระหว่าง utf8 และ utf8mb4 และนำเสนอกลยุทธ์เชิงปฏิบัติเพื่อป้องกันปัญหาการเข้ารหัส โดยการอ่านคู่มือนี้ คุณจะได้รับความรู้พื้นฐานและทักษะเชิงปฏิบัติเกี่ยวกับการจัดการชุดอักขระของ MySQL.

2. ความรู้พื้นฐานเกี่ยวกับชุดอักขระและการจัดเรียงของ MySQL

ชุดอักขระคืออะไร?

ชุดอักขระคือระบบการเข้ารหัสที่ทำให้คอมพิวเตอร์สามารถแสดงข้อความเป็นข้อมูลดิจิทัล ตัวอย่างเช่น UTF-8 ถูกใช้อย่างกว้างขวางเนื่องจากรองรับภาษาต่าง ๆ ทั่วโลก ใน MySQL utf8 และ latin1 มักถูกใช้เป็นชุดอักขระเริ่มต้น แต่ในช่วงหลายปีที่ผ่านมา utf8mb4 ได้กลายเป็นมาตรฐานที่แนะนำ.

การจัดเรียงคืออะไร?

การจัดเรียงกำหนดกฎสำหรับการเปรียบเทียบและการเรียงลำดับสตริง ตัวอย่างเช่น utf8_general_ci และ utf8_unicode_ci เป็นการจัดเรียงสำหรับ UTF-8 ทั้งสองแบบ แต่ utf8_unicode_ci ให้การเปรียบเทียบที่แม่นยำยิ่งขึ้นตามมาตรฐาน Unicode.

ความสัมพันธ์ระหว่างชุดอักขระและการจัดเรียง

ชุดอักขระกำหนดวิธีการเข้ารหัสอักขระ ในขณะที่การจัดเรียงกำหนดวิธีการเปรียบเทียบและเรียงลำดับอักขระที่เข้ารหัสแล้ว การเลือกการจับคู่ที่เหมาะสมช่วยป้องกันปัญหาการเข้ารหัสและการลดประสิทธิภาพ.

3. วิธีตรวจสอบชุดอักขระปัจจุบันใน MySQL

ใน MySQL ชุดอักขระถูกกำหนดค่าที่หลายระดับ ได้แก่ ระดับเซิร์ฟเวอร์ ระดับฐานข้อมูล ระดับตาราง และระดับคอลัมน์ ด้านล่างเป็นวิธีการตรวจสอบการตั้งค่าชุดอักขระในแต่ละระดับ.

ตรวจสอบการตั้งค่าชุดอักขระระดับเซิร์ฟเวอร์

เพื่อตรวจสอบการกำหนดค่าชุดอักขระระดับเซิร์ฟเวอร์ ให้รันคำสั่งต่อไปนี้:

SHOW VARIABLES LIKE 'character_set_%';

ผลลัพธ์จะมีลักษณะคล้ายกับต่อไปนี้:

+--------------------------+------------------+
| Variable_name            | Value            |
+--------------------------+------------------+
| character_set_client     | utf8mb4          |
| character_set_connection | utf8mb4          |
| character_set_database   | utf8mb4          |
| character_set_results    | utf8mb4          |
| character_set_server     | utf8mb4          |
| character_set_system     | utf8             |
+--------------------------+------------------+

ความหมายของแต่ละรายการ:

  • character_set_server : ชุดอักขระเริ่มต้นของเซิร์ฟเวอร์
  • character_set_database : ชุดอักขระเริ่มต้นของฐานข้อมูล

ตรวจสอบชุดอักขระของฐานข้อมูลเฉพาะ

เพื่อยืนยันการกำหนดค่าชุดอักขระของฐานข้อมูลเฉพาะ ให้ใช้คำสั่งต่อไปนี้:

SHOW CREATE DATABASE database_name;

ตัวอย่างผลลัพธ์:

CREATE DATABASE `database_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */

ตรวจสอบชุดอักขระของตารางและคอลัมน์

เพื่อตรวจสอบชุดอักขระของตารางหรือคอลัมน์ของตาราง ให้ใช้คำสั่งต่อไปนี้.

ระดับตาราง:

SHOW CREATE TABLE table_name;

ระดับคอลัมน์:

SHOW FULL COLUMNS FROM table_name;

ตัวอย่างผลลัพธ์:

+----------------+--------------+----------------------+-------+
| Field          | Type         | Collation            | Null  |
+----------------+--------------+----------------------+-------+
| column_name    | varchar(255) | utf8mb4_unicode_ci   | YES   |
+----------------+--------------+----------------------+-------+

โดยใช้คำสั่งเหล่านี้ คุณสามารถตรวจสอบได้ว่าชุดอักขระถูกกำหนดค่าอย่างถูกต้องในแต่ละระดับหรือไม่.

4. วิธีกำหนดค่าและเปลี่ยนชุดอักขระ

วิธีการเปลี่ยนชุดตัวอักษรใน MySQL จะแตกต่างกันไปขึ้นอยู่กับว่าคุณกำลังแก้ไขในระดับเซิร์ฟเวอร์ ระดับฐานข้อมูล ระดับตาราง หรือระดับคอลัมน์ ด้านล่างนี้คือคำอธิบายโดยละเอียดของแต่ละวิธีการกำหนดค่า

การเปลี่ยนการตั้งค่าในระดับเซิร์ฟเวอร์ทั้งหมด

เพื่อแก้ไขชุดตัวอักษรเริ่มต้นในระดับเซิร์ฟเวอร์ ให้แก้ไขไฟล์กำหนดค่า MySQL (โดยทั่วไปคือ my.cnf หรือ my.ini)。

ขั้นตอนการกำหนดค่า:

  1. เปิดไฟล์กำหนดค่า。
    sudo nano /etc/my.cnf
    
  1. เพิ่มหรือแก้ไขการตั้งค่าดังต่อไปนี้:
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
  1. รีสตาร์ทเซิร์ฟเวอร์ MySQL。
    sudo systemctl restart mysqld
    

การเปลี่ยนการตั้งค่าในระดับฐานข้อมูล

เพื่อเปลี่ยนชุดตัวอักษรของฐานข้อมูลเฉพาะ ให้ใช้คำสั่งดังต่อไปนี้:

คำสั่งการแก้ไข:

ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ตัวอย่าง:

ALTER DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

คำสั่งนี้จะเปลี่ยนชุดตัวอักษรเริ่มต้นสำหรับฐานข้อมูล แต่ไม่ส่งผลต่อตารางที่มีอยู่หรือข้อมูลที่เก็บไว้ หากคุณจำเป็นต้องแก้ไขตารางด้วย โปรดดูส่วนถัดไป

การเปลี่ยนการตั้งค่าในระดับตาราง

เพื่อแก้ไขชุดตัวอักษรของตารางที่มีอยู่ ให้ใช้คำสั่งดังต่อไปนี้:

คำสั่งการแก้ไข:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ตัวอย่าง:

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

คำสั่งนี้ยังอัปเดตชุดตัวอักษรของคอลัมน์ทั้งหมดภายในตารางด้วย

การเปลี่ยนการตั้งค่าในระดับคอลัมน์

หากคุณจำเป็นต้องเปลี่ยนชุดตัวอักษรของคอลัมน์เฉพาะ ให้ใช้คำสั่งดังต่อไปนี้:

คำสั่งการแก้ไข:

ALTER TABLE table_name MODIFY column_name column_type CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ตัวอย่าง:

ALTER TABLE users MODIFY username VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5. ความแตกต่างระหว่าง utf8 และ utf8mb4

ความแตกต่างทางเทคนิค

  • utf8 : ใน MySQL utf8 เป็นส่วนย่อยของ UTF-8 จริง ๆ และรองรับสูงสุด 3 ไบต์ต่อตัวอักษร เนื่องจากข้อจำกัดนี้ มันจึงไม่สามารถเก็บอิโมจิหรือตัวอักษรพิเศษบางตัว (เช่น 𠮷) ได้
  • utf8mb4 : การนำ UTF-8 มาใช้อย่างสมบูรณ์ที่รองรับสูงสุด 4 ไบต์ต่อตัวอักษร

เหตุผลที่แนะนำ utf8mb4

  • ความเข้ากันได้ : แอปพลิเคชันเว็บและมือถือสมัยใหม่จัดการอิโมจิและตัวอักษรพิเศษบ่อยครั้ง
  • การมาตรฐาน : แพลตฟอร์ม CMS หลายตัว (เช่น WordPress) แนะนำ utf8mb4 เป็นชุดตัวอักษรเริ่มต้น

ข้อควรพิจารณาสำคัญเมื่อทำการย้ายข้อมูล

เมื่อย้ายจาก utf8 ไปยัง utf8mb4 ให้ใส่ใจกับประเด็นดังต่อไปนี้:

  1. ขนาดฐานข้อมูล : เนื่องจาก utf8mb4 อาจใช้สูงสุด 4 ไบต์ต่อตัวอักษร ขนาดฐานข้อมูลอาจเพิ่มขึ้น
  2. ข้อมูลที่มีอยู่ : แนะนำอย่างยิ่งให้สำรองข้อมูลก่อนทำการเปลี่ยนแปลง
  3. การกำหนดค่าแอปพลิเคชัน : ชุดตัวอักษรที่ใช้โดยแอปพลิเคชัน (เช่น ชุดตัวอักษรการเชื่อมต่อไคลเอนต์) ต้องตั้งเป็น utf8mb4 ด้วย

6. สาเหตุและวิธีแก้ไขปัญหาการเข้ารหัส (Mojibake)

สาเหตุหลักของปัญหาการเข้ารหัส

  1. ความไม่ตรงกันของชุดตัวอักษรระหว่างไคลเอนต์และเซิร์ฟเวอร์
  • ตัวอย่าง: ไคลเอนต์ใช้ latin1 ในขณะที่เซิร์ฟเวอร์ใช้ utf8mb4
  1. การย้ายข้อมูลที่ไม่ถูกต้อง
  • ไม่ได้ระบุชุดตัวอักษรอย่างถูกต้องเมื่อนำเข้าข้อมูล
  1. การกำหนดค่าแอปพลิเคชันที่ผิดพลาด
  • ชุดตัวอักษรที่ระบุระหว่างการเชื่อมต่อฐานข้อมูลไม่ถูกต้อง

มาตรการปฏิบัติเพื่อป้องกันปัญหาการเข้ารหัส

  1. ตรวจสอบและมาตรฐานการตั้งค่าเซิร์ฟเวอร์
  • ตรวจสอบการตั้งค่าชุดตัวอักษรของเซิร์ฟเวอร์และรักษาความสอดคล้องในทุกระดับ
    SHOW VARIABLES LIKE 'character_set_%';
    
  1. ปรับการตั้งค่าไคลเอนต์
  • ระบุชุดตัวอักษรอย่างชัดเจนเมื่อสร้างการเชื่อมต่อไคลเอนต์
    SET NAMES utf8mb4;
    
  1. ระมัดระวังในระหว่างการย้ายข้อมูล
  • ระบุชุดอักขระที่ถูกต้องเมื่อทำการนำเข้าข้อมูล.
    mysql --default-character-set=utf8mb4 -u username -p database_name < dump.sql
    

7. ส่วนคำถามที่พบบ่อย

คำถามที่พบบ่อย

  1. การเปลี่ยนเป็น utf8mb4 จะส่งผลต่อประสิทธิภาพหรือไม่?
  • เนื่องจาก utf8mb4 อาจทำให้ขนาดข้อมูลเพิ่มขึ้น จึงอาจมีผลกระทบต่อประสิทธิภาพเล็กน้อยในฐานข้อมูลขนาดใหญ่มาก อย่างไรก็ตาม ในสภาพแวดล้อมการผลิตทั่วไป ปัญหานี้มักไม่เป็นเรื่องสำคัญ.
  1. มีความเสี่ยงใด ๆ เมื่อย้ายจาก utf8 ไปเป็น utf8mb4 หรือไม่?
  • กระบวนการย้ายเองไม่ได้มีความเสี่ยงโดยธรรมชาติ อย่างไรก็ตาม เพื่อป้องกันการสูญเสียข้อมูลหรือปัญหาแอปพลิเคชันระหว่างการแปลงอักขระ จำเป็นต้องทำการสำรองข้อมูลเต็มก่อน.
  1. อะไรบ้างที่เปลี่ยนแปลงเมื่อแก้ไขการจัดเรียง (collation)?
  • มันทำให้การเปรียบเทียบและการจัดเรียงสตริงแม่นยำยิ่งขึ้น สำหรับแอปพลิเคชันหลายภาษา แนะนำให้ใช้ utf8mb4_unicode_ci.

8. สรุป

ในบทความนี้ เราได้อธิบายวิธีตรวจสอบชุดอักขระของ MySQL วิธีการกำหนดค่าและแก้ไขชุดอักขระ ความแตกต่างระหว่าง utf8 และ utf8mb4 และวิธีป้องกันปัญหาการเข้ารหัส การกำหนดค่าชุดอักขระเป็นพื้นฐานสำคัญของการจัดการฐานข้อมูล และการตั้งค่าที่เหมาะสมช่วยป้องกันข้อผิดพลาดและเพิ่มประสิทธิภาพโดยตรง ใช้คู่มือนี้เป็นอ้างอิงเพื่อเลือกและกำหนดค่าชุดอักขระที่เหมาะสมสำหรับโครงการของคุณ.