Lưu trữ và đại diện cho các nhân vật là một điều, và biết cách sắp xếp và so sánh chúng là một điều khác.
Dữ liệu Unicode, được lưu trữ trong các loại XML
và N
-prefixed trong SQL Server, có thể đại diện cho tất cả các ký tự bằng tất cả ngôn ngữ (phần lớn) và đó là mục tiêu của nó. Vì vậy, đối với XML
/NCHAR
/NVARCHAR
dữ liệu (Tôi đang bỏ ra ngoài NTEXT
vì không nên sử dụng nữa), các collations không thay đổi những gì nhân vật có thể được lưu trữ. Đối với CHAR
và VARCHAR
dữ liệu, Collations làm ảnh hưởng đến những gì có thể được lưu trữ như mỗi điểm Collation đến một Mã Trang nói riêng, trong đó xác định những gì có thể được lưu trữ trong các giá trị 128 - 255.
Bây giờ, trong khi có một sắp xếp mặc định thứ tự cho tất cả các nhân vật, điều đó không thể hoạt động trên tất cả các ngôn ngữ và văn hóa. Có nhiều ngôn ngữ chia sẻ một số/nhiều/tất cả các ký tự, nhưng có các quy tắc khác nhau về cách sắp xếp chúng. Ví dụ: chữ "C" xuất hiện trước chữ "D" trong hầu hết các bảng chữ cái sử dụng các chữ cái đó. Trong tiếng Anh Mỹ, kết hợp "C" và "H" (nghĩa là "CH" là hai chữ cái riêng biệt) sẽ tự nhiên xuất hiện trước bất kỳ chuỗi nào bắt đầu bằng chữ "D".Tuy nhiên, trong một vài ngôn ngữ, sự kết hợp hai chữ cái của "CH" là đặc biệt và sắp xếp sau "D":
IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
) PRINT 'Czech_CI_AI';
IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
) PRINT 'Czech_100_CI_AI';
IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
) PRINT 'Slovak_CI_AI';
IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
) PRINT 'Slovak_CS_AS';
IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
) PRINT 'Latin1_General_100_CI_AS'
ELSE PRINT 'Nope!';
Returns:
Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!
Để xem ví dụ phân loại quy tắc trên các nền văn hóa khác nhau, vui lòng xem: Collation Charts.
Ngoài ra, bằng một số ngôn ngữ, một số chữ cái hoặc kết hợp các chữ cái tương đương với các chữ cái khác theo cách mà chúng không có trong hầu hết các ngôn ngữ khác. Ví dụ, chỉ trong tiếng Đan Mạch có một "å" tương đương với "aa". Tuy nhiên, "A" không tương đương với chỉ một số "a":
IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI
AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
) PRINT 'Danish_Greenlandic_100_CI_AI';
IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI
AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
) PRINT 'Danish_Norwegian_CI_AI';
IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI
AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
) PRINT 'Latin1_General_100_CI_AI'
ELSE PRINT 'Nope!';
Returns:
Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!
Đây là tất cả rất phức tạp, và tôi đã thậm chí không đề cập xử lý cho tên bên phải các ngôn ngữ từ trái sang phải (tiếng Do Thái và tiếng Ả Rập), tiếng Trung, tiếng Nhật, kết hợp các ký tự, v.v.
Nếu bạn muốn tìm hiểu sâu hơn về các quy tắc, hãy xem Unicode Collation Algorithm (UCA). Ví dụ trên dựa trên các ví dụ trong tài liệu đó, mặc dù tôi không tin rằng tất cả các quy tắc trong UCA đã được triển khai, đặc biệt là từ các collations Windows (collations không bắt đầu với SQL_
) được dựa trên Unicode 5.0 hoặc 6.0, tùy thuộc vào trên hệ điều hành nào bạn đang sử dụng và phiên bản Khuôn khổ .NET được cài đặt (xem SortVersion để biết chi tiết).
Vì vậy, đó là những gì Collations thực hiện. Nếu bạn muốn xem tất cả các collations có sẵn, chỉ cần chạy như sau:
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];
Một collation không [trực tiếp] nói những gì có thể được lưu trữ. Một collation xác định thứ tự và bình đẳng. Ví dụ, một số collations là không phân biệt chữ hoa chữ thường hoặc không nhạy cảm, trong khi một số khác thì không. –
@pst nếu tôi lưu trữ 'ש' và tôi thực hiện 'theo thứ tự' vì vậy anh ta nên đặt hàng bằng ký tự của nó bao gồm' ש'. ..... không? –
@ user166390 "Một collation không [trực tiếp] nói những gì có thể được lưu trữ." không hoàn toàn đúng. Nó chỉ đúng với các trường 'NVARCHAR' /' NCHAR'. Đối với các trường 'VARCHAR' và' CHAR', Collation thực sự xác định những gì có thể được lưu trữ ở đó vì nó chứa LCID xác định Trang mã. –