ความแตกต่างระหว่าง utf8 และละติน 1


129

utf8 กับ latin1 แตกต่างกันอย่างไร


3
เป็นการเข้ารหัสที่แตกต่างกัน (โดยมีอักขระบางตัวที่แมปกับลำดับไบต์ทั่วไปเช่นอักขระ ASCII และตัวอักษรเน้นเสียงหลายตัว) UTF-8 เป็นการเข้ารหัส Unicode แบบหนึ่งที่มีจุดรหัสทั้งหมด Latin1 เข้ารหัสน้อยกว่า 256 อักขระ
ShreevatsaR

นอกจากนี้ยังมี latin9 ซึ่งมีอยู่ในภาษาลินุกซ์และอาจมีการกล่าวถึงในคำถาม: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

คำตอบ:


152

UTF-8เตรียมพร้อมสำหรับการครอบครองโลกLatin1ไม่ใช่

ถ้าคุณกำลังพยายามที่จะเก็บอักขระที่ไม่ใช่ภาษาละตินเช่นจีน, ญี่ปุ่น, ภาษาฮิบรู, รัสเซีย, ฯลฯ โดยใช้การเข้ารหัส Latin1 แล้วพวกเขาจะจบลงเช่นอาการภาษาต่างดาว คุณอาจพบว่าข้อความเกริ่นนำของบทความนี้มีประโยชน์ (และมากยิ่งขึ้นหากคุณรู้จัก Java เล็กน้อย)

โปรดทราบว่าการสนับสนุน UTF-8 แบบ 4 ไบต์เต็มได้รับการแนะนำใน MySQL 5.5 เท่านั้น ก่อนเวอร์ชันดังกล่าวจะเพิ่มได้สูงสุด 3 ไบต์ต่ออักขระไม่ใช่ 4 ไบต์ต่ออักขระ ดังนั้นจึงรองรับเฉพาะเครื่องบิน BMP เท่านั้นไม่ใช่เช่นเครื่องบิน Emoji หากคุณต้องการการสนับสนุน UTF-8 4 ไบต์เต็มรูปแบบให้อัปเกรด MySQL เป็นอย่างน้อย 5.5 หรือไปที่ RDBMS อื่นเช่น PostgreSQL ใน MySQL 5.5+ utf8mb4ก็เรียกว่า


31
Mysql 5.1 รองรับ 3 ไบต์ UTF-8 อย่างไรก็ตาม Mysql 5.5 รองรับ 4 ไบต์ UTF-8 เป็น utf8mb4
velcrow

2
@BalusC คุณช่วยอธิบายเพิ่มเติมได้ไหมว่า UTF-8 ไม่รองรับอย่างสมบูรณ์ได้อย่างไร หมายความว่า Mysql 5.1 ไม่สามารถจัดเก็บอักขระ Unicode ทั้งหมดได้หรือไม่?
Pacerier

2
@Pacerier: รองรับ 3 ไบต์ต่ออักขระเท่านั้นจึงรองรับเฉพาะ BMP (อักขระ 65535 ตัวแรก) เท่านั้นส่วนที่เหลือไม่ได้ สำหรับอักขระทั้งหมดโปรดดูที่en.wikipedia.org/wiki/Plane_(Unicode)
BalusC

2
@BalusC สำหรับคนที่ใช้ 5.1.63 และไม่มีสิทธิ์อัพเดทเวอร์ชั่น mysql ของเว็บเซิร์ฟเวอร์จะมีทางเลือกอื่นอย่างไร?
Pacerier

6
@Pacerier: คุณสามารถบันทึกเป็นVARBINARYแทนVARCHARและถอดรหัส / เข้ารหัสในระดับธุรกิจด้วยตัวคุณเอง แต่นี่เป็นเรื่องที่แฮ็ก ลองถามคำถามใหม่อาจมีวิธีที่ดีกว่านี้
BalusC

48

ในภาษาละติน 1 อักขระแต่ละตัวมีความยาวเท่ากับหนึ่งไบต์ ใน utf8 อักขระสามารถประกอบด้วยมากกว่าหนึ่งไบต์ ดังนั้น utf8 จึงมีอักขระมากกว่า latin1 (และอักขระที่มีเหมือนกันไม่จำเป็นต้องแสดงด้วยไบต์ / bytesequence เดียวกัน)


1
แล้ว ascii กับ bin ล่ะ?
Yousha Aleayoub

8
@YoushaAleayoub ASCII เป็นการเข้ารหัสแบบไบต์เดียวซึ่งใช้อักขระ 0 ถึง 127 ดังนั้นจึงสามารถเข้ารหัสอักขระครึ่งหนึ่งได้มากเท่ากับละติน 1 เป็นชุดย่อยที่เข้มงวดของทั้ง latin1 และ utf8 ซึ่งหมายความว่าไบต์ 0 ถึง 127 ทั้งใน latin1 และ utf8 เข้ารหัสสิ่งเดียวกันกับที่ทำใน ASCII Bin ไม่ใช่การเข้ารหัส โดยปกติจะเป็นตัวเลือกที่คุณสามารถให้ได้เมื่ออ่านไฟล์โดยบอกให้ฟังก์ชัน IO ไม่ใช้การเข้ารหัสใด ๆ แต่ให้อ่านไฟล์ทีละไบต์แทน
sepp2k

1
ขอบคุณฉันหมายถึงbinaryเรียง ... ? และอันไหนดีกว่าสำหรับฟิลด์ภาษาอังกฤษ / ตัวเลข: ascii_general_ciหรือascii_bin?
Yousha Aleayoub
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.