อะไรคือความแตกต่างระหว่างชุดอักขระ utf8mb4 และ utf8 ใน MySQL?


341

ความแตกต่างระหว่างคืออะไรutf8mb4และutf8ชุดอักขระในMySQL ?

ฉันรู้แล้วเกี่ยวกับการเข้ารหัสASCII , UTF-8 , UTF-16และUTF-32 ; แต่ฉันอยากจะรู้ว่าอะไรที่แตกต่างของutf8mb4กลุ่มการเข้ารหัสด้วยการเข้ารหัสประเภทอื่น ๆ ที่กำหนดไว้ในเซิร์ฟเวอร์ MySQL

มีประโยชน์ / ข้อเสนอพิเศษในการใช้utf8mb4มากกว่าutf8หรือไม่?

คำตอบ:


391

UTF-8เป็นการเข้ารหัสความยาวผันแปรได้ ในกรณีของ UTF-8 หมายความว่าการจัดเก็บจุดรหัสหนึ่งจุดต้องใช้หนึ่งถึงสี่ไบต์ อย่างไรก็ตามการเข้ารหัสของ MySQL เรียกว่า "utf8" (นามแฝงของ "utf8mb3") เก็บได้สูงสุดสามไบต์ต่อหนึ่งจุดรหัสเท่านั้น

ดังนั้นชุดอักขระ "utf8" / "utf8mb3" ไม่สามารถเก็บคะแนนโค้ด Unicode ทั้งหมด: สนับสนุนเฉพาะช่วง 0x000 ถึง 0xFFFF ซึ่งเรียกว่า " Basic Multilingual Plane " ดูเพิ่มเติมเปรียบเทียบการเข้ารหัส Unicode

นี่คือสิ่งที่ (รุ่นก่อนหน้าของหน้าเดียวกัน) เอกสาร MySQLมีการพูดเกี่ยวกับมัน:

ชุดอักขระชื่อ utf8 [/ utf8mb3] ใช้สูงสุดสามไบต์ต่อตัวอักษรและมีอักขระ BMP เท่านั้น ในฐานะของ MySQL 5.5.3 ชุดอักขระ utf8mb4 ใช้สูงสุดสี่ไบต์ต่ออักขระสนับสนุนอักขระเพิ่มเติม:

  • สำหรับอักขระ BMP utf8 [/ utf8mb3] และ utf8mb4 มีลักษณะหน่วยเก็บข้อมูลที่เหมือนกัน: ค่ารหัสเดียวกันการเข้ารหัสเดียวกันความยาวเท่ากัน

  • สำหรับอักขระเสริมutf8 [/ utf8mb3] ไม่สามารถจัดเก็บอักขระได้ทั้งหมดในขณะที่ utf8mb4 ต้องการสี่ไบต์เพื่อจัดเก็บ เนื่องจาก utf8 [/ utf8mb3] ไม่สามารถเก็บอักขระได้เลยคุณไม่มีอักขระเสริมในคอลัมน์ utf8 [/ utf8mb3] และคุณไม่จำเป็นต้องกังวลเกี่ยวกับการแปลงอักขระหรือสูญเสียข้อมูลเมื่ออัปเกรด utf8 [/ utf8mb3] MySQL

ดังนั้นหากคุณต้องการให้คอลัมน์ของคุณรองรับการจัดเก็บอักขระที่อยู่นอก BMP (และคุณมักต้องการ) เช่นemojiให้ใช้ "utf8mb4" ดูเพิ่มเติมอักขระที่ไม่ใช่ BMP Unicode ทั่วไปที่ใช้บ่อยที่สุดคืออะไร .


10
กรณีเดียวที่ฉันได้พบ (จนถึง) ที่ utf8mb4 ถูก 'ต้องใช้' คือจีนและอิโมติคอน มีตัวอักษรที่คลุมเครือที่ต้องการ
Rick James

10
จำเป็นต้องมีหากคุณใช้เพื่อเก็บรหัสผ่านและข้อมูลที่เข้ารหัสไว้ในฐานข้อมูลของคุณ ฉันใช้รหัสผ่านที่เข้ารหัสใน mysql โดยใช้รูปแบบ utf8 ปกติซึ่งทำให้ฉันมีปัญหากับรหัสผ่านแบบสุ่มและยากมากที่จะทำการดีบักดังนั้นในที่สุดฉันก็พยายามใช้การเข้ารหัส base64 และแก้ไขปัญหาชั่วคราว แต่ตอนนี้ฉันรู้เหตุผลแล้ว
Mojtaba Rezaeian

38
ข้อมูล @idealidea ที่เข้ารหัสเป็นไบนารีและคุณไม่ควรเก็บข้อมูลไบนารีไว้ในคอลัมน์ varchar :)
CodeCaster

8
@thomasrutter ลองใช้อักขระนี้ (𡞰) เพื่อบันทึกด้วย UTF-8 :)
502_Geek

2
@ MojtabaRezaeian มันขึ้นอยู่กับอัลกอริทึมรหัสผ่านค่อนข้าง - bcrypt2 จะผลิต ASCII
Jasen

60

utf8mb4ชุดตัวอักษรจะเป็นประโยชน์เพราะในปัจจุบันเราต้องการการสนับสนุนสำหรับการจัดเก็บไม่เพียง แต่ตัวอักษรในภาษา แต่ยังสัญลักษณ์อีโมจิที่เพิ่งแนะนำและอื่น ๆ

อ่านดีเกี่ยวกับวิธีการสนับสนุน Unicode เต็มรูปแบบในฐานข้อมูล MySQLโดย Mathias Bynens ยังสามารถทำให้กระจ่างในเรื่องนี้


11
MySQL 8.0 เป็นค่าเริ่มต้นของชุดอักขระ utf8mb4 [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk

47

นำมาจากคู่มืออ้างอิง MySQL 8.0 :

  • utf8mb4: การเข้ารหัส UTF-8ของชุดอักขระ Unicodeโดยใช้หนึ่งถึงสี่ไบต์ต่ออักขระ

  • utf8mb3: การเข้ารหัส UTF-8ของชุดอักขระ Unicodeโดยใช้หนึ่งถึงสามไบต์ต่ออักขระ

ในMySQL utf8ในปัจจุบันคือนามแฝงสำหรับutf8mb3ที่จะเลิกและจะถูกลบออกในอนาคตMySQLปล่อย ณ จุดที่จะกลายเป็นมีการอ้างอิงถึงutf8 utf8mb4

ดังนั้นไม่ว่าจะใช้นามแฝงนี้อย่างไรคุณสามารถตั้งค่าการutf8mb4เข้ารหัสด้วยตนเองได้

เพื่อให้คำตอบสมบูรณ์ฉันต้องการเพิ่มความคิดเห็นของ @ WilliamEntrikenด้านล่าง (นำมาจากคู่มือ):

เพื่อหลีกเลี่ยงความคลุมเครือเกี่ยวกับความหมายของการutf8พิจารณาการระบุอย่างชัดเจนสำหรับการอ้างอิงในชุดตัวอักษรแทนutf8mb4utf8

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.