Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Điểm của COLLATIONS cho các cột nvarchar (Unicode) là gì?

Lưu trữ và biểu diễn các ký tự là một chuyện, còn biết cách sắp xếp và so sánh chúng là một chuyện khác.

Dữ liệu Unicode, được lưu trữ trong XMLN -các loại có tiền tố trong SQL Server, có thể đại diện cho tất cả các ký tự trong tất cả các ngôn ngữ (đối với hầu hết các phần và đó là mục tiêu của nó) với một bộ ký tự duy nhất. Vì vậy, đối với NCHAR / NVARCHAR dữ liệu (Tôi đang loại bỏ NTEXT vì nó không nên được sử dụng nữa và XML vì nó không bị ảnh hưởng bởi Collations), Collations không thay đổi những ký tự có thể được lưu trữ. Đối với CHARVARCHAR data, Collations do ảnh hưởng đến những gì có thể được lưu trữ khi mỗi Đối chiếu trỏ đến một Trang mã cụ thể, trang này xác định những gì có thể được lưu trữ trong các giá trị 128 - 255.

Bây giờ, mặc dù có một thứ tự sắp xếp mặc định cho tất cả các ký tự, nhưng nó không thể hoạt động trên tất cả các ngôn ngữ và nền 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ái "C" đứng trước chữ cái "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ỹ, sự kết hợp của "C" và "H" (tức là "CH" là hai chữ cái riêng biệt) sẽ tự nhiên đứng trước bất kỳ chuỗi nào bắt đầu bằng "D". Tuy nhiên, trong một số 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!';

Lợi nhuận:

Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!

Để xem ví dụ về các quy tắc sắp xếp giữa các nền văn hóa khác nhau, vui lòng xem: Biểu đồ đối chiếu .

Ngoài ra, trong một số ngôn ngữ, các chữ cái hoặc tổ hợp chữ cái nhất định 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, "å" mới tương đương với "aa". Nhưng, "å" không chỉ là một "a" duy nhất:

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!';

Lợi nhuận:

Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!

Tất cả điều này đều rất phức tạp và tôi thậm chí còn chưa đề cập đến việc xử lý các ngôn ngữ từ phải sang trá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 có một số thông tin chi tiết sâu sắc về các quy tắc, hãy xem Thuật toán đối chiếu Unicode (UCA) . Các 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 thực hiện, đặc biệt là kể từ khi collations Windows (collations not bắt đầu bằng SQL_ ) dựa trên Unicode 5.0 hoặc 6.0, tùy thuộc vào hệ điều hành bạn đang sử dụng và phiên bản .NET Framework được cài đặt (xem SortVersion để biết chi tiết).

Vì vậy, đó là những gì Collations làm. 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];


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận thông tin cột cho một bảng hoặc dạng xem trong SQL Server (T-SQL:sp_columns)

  2. Đếm các bản ghi cho mỗi tháng trong một năm

  3. Loại biến không mong muốn được trả về bởi Nhận-Công việc

  4. Định dạng số bằng cách đệm với các số không ở đầu trong SQL Server

  5. CHỌN CHO TỰ ĐỘNG XML và trả về các kiểu dữ liệu