Sự khác biệt giữa utf8 và latin1


128

sự khác biệt giữa utf8 và latin1 là gì?


3
Chúng là các bảng mã khác nhau (với một số ký tự được ánh xạ tới các chuỗi byte phổ biến, ví dụ các ký tự ASCII và nhiều chữ cái có dấu). UTF-8 là một mã hóa Unicode với tất cả các điểm mã của nó; Latin1 mã hóa dưới 256 ký tự.
ShreevatsaR

Ngoài ra còn có latin9 có sẵn trong các ngôn ngữ Linux và có thể đã được đề cập trong câu hỏi: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Câu trả lời:


151

UTF-8 được chuẩn bị cho sự thống trị thế giới, Latin1 thì không.

Nếu bạn đang cố lưu trữ các ký tự không phải là tiếng Latinh như tiếng Trung, tiếng Nhật, tiếng Do Thái, tiếng Nga, v.v ... bằng cách sử dụng mã hóa Latin1, thì chúng sẽ kết thúc dưới dạng mojibake . Bạn có thể thấy văn bản giới thiệu của bài viết này hữu ích (và thậm chí nhiều hơn nếu bạn biết một chút Java).

Lưu ý rằng hỗ trợ UTF-8 đầy đủ 4 byte chỉ được giới thiệu trong MySQL 5.5. Trước phiên bản đó, nó chỉ đi tối đa 3 byte cho mỗi ký tự, không phải 4 byte cho mỗi ký tự. Vì vậy, nó chỉ hỗ trợ mặt phẳng BMP chứ không hỗ trợ mặt phẳng Emoji. Nếu bạn muốn hỗ trợ UTF-8 đầy đủ 4 byte, hãy nâng cấp MySQL lên ít nhất 5,5 hoặc tìm RDBMS khác như PostgreQuery. Trong MySQL 5.5+, nó được gọi là utf8mb4.


31
Mysql 5.1 hỗ trợ 3 byte UTF-8, tuy nhiên Mysql 5.5 không hỗ trợ UTF-8 4 byte như utf8mb4.
khóa dán

2
@BalusC Bạn có thể nói rõ hơn về cách UTF-8 không được hỗ trợ đầy đủ không? Điều đó có nghĩa là Mysql 5.1 không thể lưu trữ tất cả các ký tự unicode?
Pacerier

2
@Pacerier: nó chỉ hỗ trợ 3 byte cho mỗi ký tự, do đó chỉ hỗ trợ BMP (65535 ký tự đầu tiên), còn lại thì không. Đối với tất cả các nhân vật, xem en.wikipedia.org/wiki/Plane_(Unicode)
BalusC

2
@BalusC Đối với những người sử dụng 5.1.63 và không có đặc quyền cập nhật phiên bản mysql của máy chủ web, đâu có thể là lựa chọn thay thế?
Pacerier

6
@Pacerier: Bạn có thể lưu VARBINARYthay vì VARCHARvà giải mã / mã hóa trong tầng doanh nghiệp, nhưng đây là hacky. Cân nhắc hỏi một câu hỏi mới, có thể có những cách tốt hơn.
BalusC

47

Trong latin1 mỗi ký tự dài chính xác một byte. Trong utf8, một ký tự có thể bao gồm nhiều hơn một byte. Do đó, utf8 có nhiều ký tự hơn latin1 (và các ký tự mà chúng có chung không nhất thiết phải được biểu thị bằng cùng một byte / bykishquence).


1
Còn ascii và bin thì sao?
Yousha Aleayoub

8
@YoushaAleayoub ASCII là một mã hóa một byte sử dụng các ký tự từ 0 đến 127, vì vậy nó có thể mã hóa một nửa số ký tự như latin1. Đây là một tập hợp con nghiêm ngặt của cả latin1 và utf8, nghĩa là các byte từ 0 đến 127 trong cả latin1 và utf8 đều mã hóa những thứ giống như chúng làm trong ASCII. Bin không phải là mã hóa. Đây thường là một tùy chọn mà bạn có thể đưa ra khi đọc tệp, yêu cầu các hàm IO không áp dụng bất kỳ mã hóa nào, mà thay vào đó chỉ đọc từng tệp byte theo byte.
sepp2k

1
cảm ơn, ý tôi là binaryđối chiếu ...? và cái nào tốt hơn cho các trường tiếng Anh / số: ascii_general_cihay ascii_bin?
Yousha Aleayoub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.