Tôi nên chọn đối chiếu nào cho một trang web ngôn ngữ muiti?


25

Liệu một đối chiếu có bất kỳ ảnh hưởng đến tốc độ truy vấn? Có kích thước của một bảng thay đổi tùy thuộc vào đối chiếu?

Nếu tôi muốn xây dựng một trang web phải hỗ trợ tất cả các ngôn ngữ có thể (ví dụ như Google), đó sẽ là đối chiếu được đề xuất?

Tôi sẽ cần lưu trữ các ký tự như 日本語, các tìm kiếm của tôi trên trang web sẽ phải trả lại somethingcho sóméthíngđầu vào, nó cũng không phân biệt chữ hoa chữ thường.

Làm thế nào để tôi biết đâu là lựa chọn tốt nhất để thực hiện? Đối chiếu nào phù hợp hơn với trường hợp này?


4
Bạn có thể muốn viết lại câu hỏi để nó không nghe có vẻ chủ quan - đối chiếu "tốt nhất" bằng biện pháp nào? :)
TML

Tiêu đề mới đọc tốt hơn nhiều
TML

Câu trả lời:


16

Nói chung, một trong các biến thể Unicode có lẽ là tốt nhất để hỗ trợ ngôn ngữ rộng - UTF-8 sẽ sử dụng ít bộ nhớ hơn cho mỗi loại tiền mã hóa, và do đó sẽ có một lợi thế nhỏ trong bất kỳ sự đánh đổi không gian / thời gian nào bạn thấy mình cần thực hiện; tuy nhiên, tôi nghĩ rằng có một số ngôn ngữ / tập lệnh bí truyền hơn mà UTF-8 không thể đại diện (nhưng tôi không chắc chắn 100% về điều đó, tôi đã không thực hiện một nghiên cứu đầy đủ về vấn đề này).

Bài viết Wikipedia này có thể khai sáng về những ưu điểm / lợi thế của mỗi bài viết.


Có, UTF-8 có thể xử lý 1,1 triệu điểm mã Unicode.
vz0

Cảm ơn - Tôi nghĩ rằng có một số ký tự chữ Hán hoặc tương tự không được hỗ trợ trong UTF-8, thật tốt khi có câu trả lời chắc chắn.
TML


8

Tôi nghĩ rằng câu hỏi như đã nêu (vào ngày 2015-04-20, "Đối chiếu nào [...]") không có nghĩa gì, vì câu trả lời được chấp nhận nói về mã hóa thay vì đối chiếu. Hãy để tôi trả lời câu hỏi đã nêu chứ không phải câu hỏi dự định, chỉ vì tôi nghĩ nó thú vị :-)

Wikipedia nói "Đối chiếu là tập hợp thông tin bằng văn bản thành một trật tự tiêu chuẩn". Trong điện toán, đối chiếu đã mang ý nghĩa của "một đặc tả của thứ tự như vậy". Nói cách khác, đối chiếu là (hoặc ngụ ý) một định nghĩa của hàm so sánh ba chiều.

Tôi nghĩ rằng câu trả lời ngắn gọn là "chắc chắn có thể". Ít nhất là tôi biết về các shenanigans sau:

#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12  # \xf6 is one character
assert len(enc) == 13   # but two bytes in utf-8

import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38

locale.strxfrmlà một hàm Returns a string that behaves for cmp locale-aware, nghĩa là, nó mã hóa một chuỗi sao cho so sánh từ điển chuẩn theo từng byte so với một chuỗi khác được mã hóa tương tự sẽ tạo ra kết quả tương tự như so sánh các chuỗi theo hàm đối chiếu được chỉ định bởi miền địa phương.

Một số quan sát: trong da_DK.utf8, chuỗi ouüöđược sắp xếp. Trong de_DE.utf8, chuỗi oöuüđược sắp xếp. Lưu ý rằng len(long_form) == 38và 38> 13. (Độ dài cũng là 38 in de_DE.utf8.)

Nếu cơ sở dữ liệu của bạn có một chỉ mục trên một số trường chuỗi, được đối chiếu theo da_DK.utf8, thì bên trong nó thể đang làm một cái gì đó giống như strxfrmđể có một so sánh đơn giản. (Mặt khác, các đĩa chậm. Có thể lập chỉ mục nhanh hơn dựa trên biểu diễn nhỏ gọn hơn, nếu chi phí so sánh trên mỗi ký tự cao hơn nhiều so với bù bằng cách so sánh ít ký tự hơn.)

Bạn hỏi "Đối chiếu có ảnh hưởng gì đến tốc độ truy vấn không?", Tôi chắc chắn câu trả lời là có: đối chiếu "C" (còn gọi là "POSIX") chỉ so sánh các giá trị điểm mã unicode, trong khi tiếng Đan Mạch ( da_DK.utf8) và tiếng Đức ( de_DE.utf8) làm một cái gì đó khó khăn hơn. Điều này sẽ có một số tác động đến tốc độ truy vấn, mặc dù tôi nghi ngờ rằng nó sẽ không đáng lo ngại.

"Kích thước của một bảng có thay đổi tùy theo đối chiếu không?" - Tôi có thể tưởng tượng có một chỉ mục theo một đối chiếu và một chỉ mục khác theo đối chiếu khác, hoặc chỉ một trong hai chỉ số như vậy, với một số strxfrmchuyển đổi giống như được áp dụng. Trong kịch bản giả thuyết đó, nếu có hai đối chiếu với các đặc điểm kích thước khác nhau, câu trả lời là có.

"đó sẽ là đối chiếu được đề nghị?" - Điều đó phụ thuộc vào lý do tại sao bạn cần sắp xếp chuỗi. Nếu chỉ có một số cách sắp xếp chuỗi chính tắc, có lẽ tôi sẽ đi với "C". Nếu nó trình bày dữ liệu cho người dùng theo thứ tự được sắp xếp theo kỳ vọng của con người và những kỳ vọng đó được định hình bởi văn hóa của họ và bạn muốn cơ sở dữ liệu (chứ không phải một số lớp khác) thực hiện sắp xếp, có lẽ bạn nên tạo một chỉ mục cho mỗi đối chiếu , tức là ít nhất một theo da_DK.utf8người Đan Mạch và một theo de_DE.utf8người Đức. Tôi nghĩ rằng điều này có thể trở nên khá lớn khá nhanh chóng, mặc dù.

Tất cả điều này phụ thuộc rất nhiều vào hoạt động bên trong cơ sở dữ liệu của bạn; Tôi nghĩ rằng nó vượt xa SQL "chuẩn hóa" (lol!). Như mọi khi, tham khảo tài liệu cho hệ thống cơ sở dữ liệu cụ thể của bạn.

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.