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.strxfrm
là 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) == 38
và 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ó có 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ố strxfrm
chuyể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.utf8
người Đan Mạch và một theo de_DE.utf8
ngườ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.