Bộ ký tự và đối chiếu chính xác có nghĩa là gì?


315

Tôi có thể đọc tài liệu MySQL và nó khá rõ ràng. Nhưng, làm thế nào để một người quyết định sử dụng bộ ký tự nào? Đối chiếu dữ liệu nào có ảnh hưởng?

Tôi đang yêu cầu một lời giải thích về hai và làm thế nào để chọn chúng.

Câu trả lời:


511

Từ tài liệu MySQL :

Một bộ ký tự là một tập hợp các ký hiệu và mã hóa. Một chiếu là một bộ quy tắc để so sánh các ký tự trong một bộ ký tự. Hãy làm rõ sự khác biệt bằng một ví dụ về một bộ ký tự tưởng tượng.

Giả sử rằng chúng ta có một bảng chữ cái với bốn chữ cái: 'A', 'B', 'a', 'b'. Chúng tôi cung cấp cho mỗi chữ cái một số: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. Chữ 'A' là ký hiệu, số 0 là mã hóa cho 'A' và sự kết hợp của cả bốn chữ cái và bảng mã của chúng là một bộ ký tự.

Bây giờ, giả sử rằng chúng ta muốn so sánh hai giá trị chuỗi, 'A' và 'B'. Cách đơn giản nhất để làm điều này là xem xét các bảng mã: 0 cho 'A' và 1 cho 'B'. Vì 0 nhỏ hơn 1, nên chúng tôi nói 'A' nhỏ hơn 'B'. Bây giờ, những gì chúng ta vừa làm là áp dụng đối chiếu cho bộ ký tự của chúng ta. Đối chiếu là một tập hợp các quy tắc (chỉ có một quy tắc trong trường hợp này): "so sánh các mã hóa." Chúng tôi gọi điều này đơn giản nhất trong tất cả các đối chiếu có thể là đối chiếu nhị phân.

Nhưng nếu chúng ta muốn nói rằng chữ thường và chữ in hoa là tương đương thì sao? Sau đó, chúng ta sẽ có ít nhất hai quy tắc: (1) coi các chữ cái viết thường 'a' và 'b' tương đương với 'A' và 'B'; (2) sau đó so sánh các bảng mã. Chúng tôi gọi đây là đối chiếu không phân biệt chữ hoa chữ thường. Nó phức tạp hơn một chút so với đối chiếu nhị phân.

Trong cuộc sống thực, hầu hết các bộ ký tự có nhiều ký tự: không chỉ 'A' và 'B' mà cả bảng chữ cái, đôi khi nhiều bảng chữ cái hoặc hệ thống chữ viết phía đông với hàng ngàn ký tự, cùng với nhiều ký hiệu và dấu chấm câu đặc biệt. Ngoài ra trong cuộc sống thực, hầu hết các bộ sưu tập đều có nhiều quy tắc: không chỉ phân biệt chữ hoa chữ thường mà cả độ không nhạy của dấu ("dấu" là một dấu gắn liền với một ký tự như trong tiếng Đức 'ö') và ánh xạ nhiều ký tự (chẳng hạn như quy tắc ' ö '=' OE 'ở một trong hai bộ sưu tập của Đức).


206

Một mã hóa ký tự là một cách để nhân vật mã hóa để họ phù hợp trong bộ nhớ. Nghĩa là, nếu bộ ký tự là ISO-8859-15, ký hiệu đồng euro, €, sẽ được mã hóa thành 0xa4 và trong UTF-8, nó sẽ là 0xe282ac.

Đối chiếu là cách so sánh các ký tự, trong latin9, có các chữ cái e é è ê f, nếu được sắp xếp theo biểu diễn nhị phân của chúng, nó sẽ đi e f é ê ènhưng nếu đối chiếu được đặt thành, ví dụ như tiếng Pháp, bạn sẽ có chúng theo thứ tự bạn nghĩ chúng sẽ là, tất cả e é è êđều bằng nhau, và sau đó f.


5
Điều quan trọng cần lưu ý rằng có thể có nhiều bộ sưu tập khác nhau cho một bộ ký tự duy nhất. Cái "đúng" phụ thuộc vào ngữ nghĩa của văn bản thường được xác định bởi ngôn ngữ mà nó được viết.
Phil

20

Một bộ ký tự là một tập hợp con của tất cả các glyphs bằng văn bản. Mã hóa ký tự xác định cách các ký tự đó được ánh xạ tới các giá trị số. Một số mã hóa ký tự, như UTF-8 và UTF-16, có thể mã hóa bất kỳ ký tự nào trong Bộ ký tự phổ quát. Những người khác, như US-ASCII hoặc ISO-8859-1 chỉ có thể mã hóa một tập hợp con nhỏ, vì chúng sử dụng lần lượt 7 và 8 bit cho mỗi ký tự. Bởi vì nhiều tiêu chuẩn chỉ định cả bộ ký tự và mã hóa ký tự, thuật ngữ "bộ ký tự" thường được thay thế tự do cho "mã hóa ký tự".

Đối chiếu bao gồm các quy tắc xác định cách so sánh các ký tự để sắp xếp. Quy tắc đối chiếu có thể là địa phương cụ thể: thứ tự đúng của hai ký tự khác nhau tùy theo ngôn ngữ.

Việc chọn một bộ ký tự và đối chiếu tùy thuộc vào việc ứng dụng của bạn có được quốc tế hóa hay không. Nếu không, địa điểm bạn đang nhắm mục tiêu là gì?

Để chọn bộ ký tự bạn muốn hỗ trợ, bạn phải xem xét ứng dụng của mình. Nếu bạn đang lưu trữ đầu vào do người dùng cung cấp, có thể khó thấy trước tất cả các vị trí mà phần mềm của bạn cuối cùng sẽ được sử dụng. Để hỗ trợ tất cả, có lẽ tốt nhất là hỗ trợ UCS (Unicode) ngay từ đầu. Tuy nhiên, có một chi phí cho việc này; nhiều ký tự Tây Âu bây giờ sẽ yêu cầu hai byte lưu trữ cho mỗi ký tự thay vì một ký tự.

Chọn đối chiếu đúng có thể giúp thực hiện nếu cơ sở dữ liệu của bạn sử dụng đối chiếu để tạo chỉ mục và sau đó sử dụng chỉ mục đó để cung cấp kết quả được sắp xếp. Tuy nhiên, vì quy tắc đối chiếu thường là đặc trưng của miền địa phương, chỉ mục đó sẽ vô giá trị nếu bạn cần sắp xếp kết quả theo quy tắc của miền địa phương khác.


xin lỗi anh bạn tôi chỉ mới bắt đầu và chỉ cần làm rõ của bạn. Vì vậy, tôi có thể hiểu đối chiếu như thế này không, điều đó đảm bảo rằng mỗi ký tự (là tiếng Latin hoặc tiếng Trung Quốc) được nhận dạng đúng và được mã hóa tương ứng. Đúng không? Tôi hy vọng câu trả lời của bạn
Mirich

1
@Mirich Không, đối chiếu là thông tin về cách sắp xếp các ký tự. Các khu vực khác nhau trên thế giới thích sắp xếp các nhân vật theo những cách khác nhau.
erickson

3

Tôi đề nghị sử dụng utf8mb4_unicode_ci, dựa trên tiêu chuẩn Unicode để sắp xếp và so sánh, sắp xếp chính xác trong một phạm vi ngôn ngữ rất rộng.


3
từ OP: "Tôi đang yêu cầu một lời giải thích về hai người và cách chọn họ"
Dan Esparza

1
@simhumileco, xin lỗi anh bạn Tôi mới bắt đầu và chỉ cần bạn làm rõ. Vì vậy, tôi có thể hiểu đối chiếu như thế này không, điều đó đảm bảo rằng mỗi ký tự (là tiếng Latin hoặc tiếng Trung Quốc) được nhận dạng đúng và được mã hóa tương ứng. Đúng không? Tôi hy vọng câu trả lời của bạn
Mirich

1
@Mirich Tất cả phụ thuộc vào việc bạn sử dụng mã hóa nào ở những nơi khác, nếu bạn sử dụng UTF-8mã hóa trong một hệ thống bên ngoài cơ sở dữ liệu, thì mọi thứ trong cơ sở dữ liệu cũng sẽ được viết đúng nếu bạn sử dụng utf8mb4trong MySQL . Khi nói đến hoạt động chính xác của việc sắp xếp, so sánh và chuyển đổi văn bản cho các ký tự cụ thể trong MySQL , thật khó để tìm ra giải pháp hoàn hảo, nhưng *_unicode_cichắc chắn là tốt hơn *_general, nhưng nó cũng có nhược điểm. Vui lòng đọc: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco
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.