2012-03-18 23 views
10

IVe đọc rất nhiều về điều này.Điểm COLLATIONS cho cột nvarchar (Unicode) là gì?

Vẫn còn một số câu hỏi sau:

Im không nói về trường hợp nhạy cảm ở đây ...

  • Nếu tôi có một char (ש ví dụ) và ông được lưu trữ trong nvarchar - có thể giữ bất cứ điều gì , Tại sao tôi cần collation ở đây?

  • Nếu tôi là "Facebook" và tôi cần khả năng lưu trữ all chars từ all ngôn ngữ, mối quan hệ giữa đối chiếu và cột nvarchar tôi là gì?

Xin cảm ơn trước.

+5

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. –

+0

@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? –

+0

@ 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ã. –

Trả lời

8

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 XMLN -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 CHARVARCHAR 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]; 
6

Nếu bạn có một thẻ, thì không có đơn hàng nào. Nhưng nếu bạn đặt hàng ví dụ NAMES OF PEOPLE - các ký tự đặc biệt khác nhau trong các ngôn ngữ khác nhau được sắp xếp khác nhau tùy thuộc vào đối chiếu.

đầu tiên một đối chiếu có thể phân biệt chữ hoa chữ thường - hiển thị tất cả B trước ký tự đặc biệt thứ hai và thứ hai có các quy tắc đặc biệt tùy thuộc vào đối chiếu.

Tài liệu khá tốt về điều đó.

+0

Làm thế nào sql có thể sắp xếp tiếng Anh, arabic, hebrew với nhau? không có logic chung ...? vui lòng giải thích –

+0

Bạn có thể, nếu bạn không biết gì. Và sử dụng ví dụ như fort thứ tự ở khắp mọi nơi. Saldly này không nhất thiết phải chính xác. http://www.sqlservercentral.com/blogs/rocks/2012/01/09/revised-difference-between-collation-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as/ có một ví dụ (tiếng Tây Ban Nha). bạn nghĩ MS là kẻ ngốc? http://msdn.microsoft.com/en-us/library/ms144250.aspx có tất cả collations và rất nhiều trong số đó là langauge cụ thể. Bạn nghĩ rằng họ làm điều đó mà không có một lý do? Không, do đó, thời gian vị trí của các ký tự đặc biệt theo thứ tự sắp xếp phụ thuộc vào ngôn ngữ. – TomTom

6

Tôi nghĩ rằng áp phích ban đầu đang bị nhầm lẫn giữa CODE PAGES và COLLATIONS.

"n" trong nvarchar/nchar cho phép bạn lưu trữ văn bản bằng cách sử dụng bộ số unicode đủ lớn để kết hợp tất cả các ký tự bằng tất cả ngôn ngữ (về nguyên tắc) với số duy nhất. Bản thân điều này không liên quan đến collations. nvarchar/nchar không sử dụng CODE PAGES để mã hóa/giải mã ý nghĩa của từng mã ký tự.

Sắp xếp xác định thứ tự sắp xếp các ký tự và các biến thể ký tự nào sẽ được coi là giống hệt nhau. nvarchar/nchar DOES sử dụng COLLATIONS để xác định những khác biệt này.

Các vấn đề liên quan