'THU THẬP SQL_Latin1_General_CP1_CI_AS' làm gì?


134

Tôi có một truy vấn SQL để tạo cơ sở dữ liệu trong SQLServer như được đưa ra dưới đây:

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

Nó chạy tốt

Trong khi phần còn lại của SQL rõ ràng là tôi khá bối rối về chức năng của COLLATE SQL_Latin1_General_CP1_CI_AS.

bất cứ ai có thể giải thích điều này với tôi? Ngoài ra, tôi muốn biết nếu tạo cơ sở dữ liệu theo cách này là một cách thực hành tốt nhất?

Câu trả lời:


246

Nó thiết lập cách sắp xếp máy chủ cơ sở dữ liệu (so sánh các đoạn văn bản). trong trường hợp này:

SQL_Latin1_General_CP1_CI_AS

chia thành các phần thú vị:

  1. latin1 làm cho máy chủ xử lý chuỗi bằng bộ ký tự Latin 1, về cơ bản là ascii
  2. CP1 là viết tắt của Mã Trang 1252
  3. CI trường hợp so sánh không nhạy cảm để 'ABC' sẽ bằng 'abc'
  4. AS giọng nhạy cảm, vì vậy 'ü' không bằng 'u'

PS Để biết thêm thông tin chi tiết, hãy nhớ đọc câu trả lời của @ solomon-rutzky .


11
Điều gì sẽ là sự khác biệt giữa này và SQL_Latin1_General_CI_AS. Cụ thể, CP1 khiến tôi băn khoăn.
Kad

7
@Kad: Dường như không có a SQL_Latin1_General_CI_AS. Thay vào đó, có một Latin1_General_CI_AS. Xem SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. Có sự khác biệt tinh tế liên quan đến việc sắp xếp và so sánh giữa hai lần đối chiếu. Xem olcot.co.uk/sql-bloss/ .
Riley Major

4
@Kad: CP1 là viết tắt của Mã Trang 1252. Trang mã là bảng tra cứu để ánh xạ giá trị hex đến một ký tự cụ thể trong một bộ ký tự. CP1 là viết tắt của CP1252 trong văn hóa phụ của Microsoft. Windows là nền tảng duy nhất sử dụng CP1252 một cách bản địa vì nó là một nền tảng từ ngày DOS. Mặc dù nó rất giống với ISO 8859-1, nhưng chúng không giống nhau. Có sự khác biệt trong các ký tự được ánh xạ như đồng euro và một số khác không có trong ISO 8859-1.
slartibartfast

Câu trả lời hoàn hảo @Kris!
gaurav

@Kris Có bất kỳ thay thế UTF-8 nào cho SQL_Latin1_General_CP1_CI_AS trong SQL2019 không?
Chanky

71

Xin lưu ý rằng câu trả lời được chấp nhận là một chút không đầy đủ. Có, ở cấp độ cơ bản nhất Collation xử lý sắp xếp. NHƯNG, các quy tắc so sánh được xác định bởi Đối chiếu đã chọn được sử dụng ở nhiều nơi bên ngoài các truy vấn của người dùng đối với dữ liệu người dùng.

Nếu "Làm gì COLLATE SQL_Latin1_General_CP1_CI_AS?" có nghĩa là " COLLATEmệnh đề của CREATE DATABASElàm gì?", sau đó:

Các COLLATE {collation_name}điều khoản của CREATE DATABASEtuyên bố xác định Collation mặc định của Cơ sở dữ liệu , và không Server; Bộ sưu tập mặc định ở cấp cơ sở dữ liệu và cấp máy chủ kiểm soát những thứ khác nhau.

Các điều khiển máy chủ (tức là Instance) -level :

  • Collation cơ sở dữ liệu cấp cho cơ sở dữ liệu hệ thống: master, model, msdb, và tempdb.
  • Do kiểm soát Collation cấp DB tempdb, sau đó nó là Collation mặc định cho các cột chuỗi trong các bảng tạm thời (toàn cục và cục bộ), nhưng không phải là biến bảng.
  • Do kiểm soát Collation cấp DB master, sau đó Collation được sử dụng cho dữ liệu cấp Máy chủ , chẳng hạn như tên Cơ sở dữ liệu (tức là namecột trong sys.databases), Tên đăng nhập, v.v.
  • Xử lý tên tham số / biến
  • Xử lý tên con trỏ
  • Xử lý GOTOnhãn
  • Đối chiếu mặc định được sử dụng cho Cơ sở dữ liệu mới được tạo khi COLLATEthiếu mệnh đề

Điều khiển cấp cơ sở dữ liệu :

  • Mặc định Collation sử dụng cho cột chuỗi mới được tạo ra ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, và NTEXT- nhưng không sử dụng TEXThoặc NTEXT) khi COLLATEkhoản là mất tích từ định nghĩa cột. Điều này đi cho cả hai CREATE TABLEALTER TABLE ... ADDbáo cáo.
  • Collation mặc định được sử dụng cho chuỗi ký tự (tức là 'some text') và biến chuỗi (tức là @StringVariable). Collation này chỉ được sử dụng khi so sánh các chuỗi và biến với các chuỗi và biến khác. Khi so sánh các chuỗi / biến với các cột, thì Collation của cột sẽ được sử dụng.
  • Collation được sử dụng cho siêu dữ liệu cấp cơ sở dữ liệu, chẳng hạn như tên đối tượng (ví dụ sys.objects), tên cột (tức là sys.columns), tên chỉ mục (tức là sys.indexes), v.v.
  • Collation được sử dụng cho các đối tượng cấp cơ sở dữ liệu : bảng, cột, chỉ mục, v.v.

Cũng thế:

  • ASCII là một mã hóa 8 bit (đối với việc sử dụng phổ biến; về mặt kỹ thuật "ASCII" là 7 bit với các giá trị ký tự 0 - 127 và "ASCII Extended" là 8 bit với các giá trị ký tự 0 - 255). Nhóm này là giống nhau trên các nền văn hóa.
  • Trang Mã là phần "mở rộng" của ASCII mở rộng và kiểm soát các ký tự được sử dụng cho các giá trị 128 - 255. Nhóm này khác nhau giữa mỗi nền văn hóa.
  • Latin1không không có nghĩa là "ASCII" vì chỉ có tiêu chuẩn ASCII giá trị vỏ 0-127, và tất cả các trang mã (có thể được đại diện trong SQL Server, và thậm chí NVARCHAR) ánh xạ chúng 128 giá trị cùng với các nhân vật tương tự.

Nếu "Làm gì COLLATE SQL_Latin1_General_CP1_CI_AS?" có nghĩa là "đối chiếu cụ thể này làm gì?", sau đó:

  • Vì tên bắt đầu bằng SQL_, đây là đối chiếu SQL Server, không phải đối chiếu Windows. Đây chắc chắn là lỗi thời, ngay cả khi không chính thức bị phản đối và chủ yếu là để tương thích trước SQL Server 2000. Mặc dù, khá tiếc SQL_Latin1_General_CP1_CI_ASlà rất phổ biến do nó là mặc định khi cài đặt trên hệ điều hành sử dụng tiếng Anh Mỹ làm ngôn ngữ. Những va chạm này nên tránh nếu có thể.

    Các đối chiếu Windows (những tên có tên không bắt đầu SQL_) mới hơn, nhiều chức năng hơn, có sự sắp xếp nhất quán giữa VARCHARNVARCHARcho cùng một giá trị và đang được cập nhật với trọng số sắp xếp bổ sung / sửa lỗi và ánh xạ chữ hoa / chữ thường. Các đối chiếu này cũng không có vấn đề về hiệu suất tiềm năng mà các đối chiếu SQL Server có: Tác động đến các Chỉ mục khi Trộn các loại VARCHAR và NVARCHAR .

  • Latin1_General là văn hóa / địa phương.
    • Đối với NCHAR, NVARCHARNTEXTdữ liệu này xác định các quy tắc ngôn ngữ được sử dụng để sắp xếp và so sánh.
    • Đối với CHAR, VARCHARTEXTdữ liệu (cột, chữ và biến), điều này xác định:
      • quy tắc ngôn ngữ được sử dụng để phân loại và so sánh.
      • trang mã được sử dụng để mã hóa các ký tự. Ví dụ: các bộ Latin1_Generalsưu tập sử dụng mã trang 1252, các bộ Hebrewsưu tập sử dụng mã trang 1255, v.v.
  • CP{code_page} hoặc là {version}

    • Đối với các bộ sưu tập SQL Server : CP{code_page}, là trang mã 8 bit xác định ký tự nào ánh xạ tới các giá trị 128 - 255. Trong khi có bốn trang mã cho Bộ ký tự hai byte (DBCS) có thể sử dụng kết hợp 2 byte để tạo nhiều hơn 256 ký tự, những ký tự này không có sẵn cho các đối chiếu SQL Server.
    • Đối với các đối chiếu Windows : {version}, mặc dù không có trong tất cả các tên đối chiếu, đề cập đến phiên bản SQL Server trong đó đối chiếu được giới thiệu (đối với hầu hết các phần). Các đối chiếu Windows không có số phiên bản trong tên là phiên bản 80(có nghĩa là SQL Server 2000 vì đó là phiên bản 8.0). Không phải tất cả các phiên bản của SQL Server đều có các đối chiếu mới, do đó, có các khoảng trống trong số phiên bản. Có một số 90(đối với SQL Server 2005, phiên bản 9.0), hầu hết là 100(đối với SQL Server 2008, phiên bản 10.0) và một bộ nhỏ có 140(đối với SQL Server 2017, phiên bản 14.0).

      Tôi đã nói "phần lớn" bởi vì các bộ sưu tập kết thúc _SCđược giới thiệu trong SQL Server 2012 (phiên bản 11.0), nhưng dữ liệu cơ bản không phải là mới, chúng chỉ thêm hỗ trợ cho các ký tự bổ sung cho các hàm dựng sẵn. Vì vậy, những kết thúc đó tồn tại cho phiên bản 90100đối chiếu, nhưng chỉ bắt đầu trong SQL Server 2012.

  • Tiếp theo, bạn có độ nhạy, có thể ở bất kỳ kết hợp nào sau đây, nhưng luôn được chỉ định theo thứ tự này:
    • CS= CIphân biệt chữ hoa chữ thường hoặc = không phân biệt chữ hoa chữ thường
    • AS= accent-nhạy hoặc AI= accent-insensitive
    • KS = Kana loại nhạy cảm hoặc thiếu = Kana loại không nhạy cảm
    • WS = nhạy cảm với chiều rộng hoặc thiếu = độ rộng không nhạy
    • VSS = bộ chọn biến thể nhạy cảm (chỉ khả dụng trong các bộ sưu tập 140 phiên bản) hoặc thiếu = bộ chọn biến thể không nhạy
  • Tùy chọn cuối cùng:

    • _SCở cuối có nghĩa là "Hỗ trợ nhân vật bổ sung". "Hỗ trợ" chỉ ảnh hưởng đến cách các hàm dựng sẵn diễn giải các cặp thay thế (đó là cách các ký tự bổ sung được mã hóa trong UTF-16). Không có _SCở cuối (hoặc _140_ở giữa), các hàm dựng sẵn không nhìn thấy một ký tự bổ sung duy nhất, mà thay vào đó, nhìn thấy hai điểm mã vô nghĩa tạo nên cặp thay thế. Kết thúc này có thể được thêm vào bất kỳ đối chiếu không nhị phân, phiên bản 90 hoặc 100.
    • _BINhoặc _BIN2cuối cùng có nghĩa là phân loại và so sánh "nhị phân". Dữ liệu vẫn được lưu trữ như nhau, nhưng không có quy tắc ngôn ngữ. Kết thúc này không bao giờ được kết hợp với bất kỳ trong số 5 nhạy cảm hoặc _SC. _BINlà phong cách cũ hơn, và _BIN2là phong cách mới hơn, chính xác hơn. Nếu sử dụng SQL Server 2005 hoặc mới hơn, hãy sử dụng _BIN2. Để biết chi tiết về sự khác biệt giữa _BIN_BIN2, vui lòng xem: Sự khác biệt giữa các Bộ sưu tập nhị phân khác nhau (Văn hóa, Phiên bản và BIN so với BIN2) .
    • _UTF8là một tùy chọn mới kể từ SQL Server 2019. Đây là mã hóa 8 bit cho phép lưu trữ dữ liệu Unicode VARCHARCHARkiểu dữ liệu (nhưng không phải là TEXTkiểu dữ liệu không dùng nữa ). Tùy chọn này chỉ có thể được sử dụng cho các bộ sưu tập hỗ trợ các ký tự bổ sung (ví dụ: bộ sưu tập phiên bản 90 hoặc 100 với _SCtên của chúng và bộ sưu tập 140 phiên bản). Ngoài ra còn có một _UTF8đối chiếu nhị phân duy nhất ( _BIN2, không _BIN).

      XIN LƯU Ý: UTF-8 được thiết kế / tạo để tương thích với môi trường / mã được thiết lập cho mã hóa 8 bit nhưng muốn hỗ trợ Unicode. Mặc dù có một vài tình huống trong đó UTF-8 có thể cung cấp tiết kiệm không gian tới 50% so với NVARCHAR, đó là một tác dụng phụ và có chi phí ảnh hưởng nhẹ đến hiệu suất trong nhiều / hầu hết các hoạt động. Nếu bạn cần điều này để tương thích, thì chi phí có thể chấp nhận được. Nếu bạn muốn điều này để tiết kiệm không gian, bạn đã kiểm tra tốt hơn và KIỂM TRA LẠI. Kiểm tra bao gồm tất cả các chức năng và không chỉ là một vài hàng dữ liệu. Được cảnh báo rằng các đối chiếu UTF-8 hoạt động tốt nhất khi TẤT CẢ các cột và chính cơ sở dữ liệu đang sử dụng VARCHARdữ liệu (cột, biến, chuỗi ký tự) với một_UTF8đối chiếu. Đây là trạng thái tự nhiên cho bất cứ ai sử dụng điều này để tương thích, nhưng không phải cho những người hy vọng sử dụng nó để tiết kiệm không gian. Cẩn thận khi trộn dữ liệu VARCHAR bằng cách sử dụng _UTF8đối chiếu với VARCHARdữ liệu bằng cách sử dụng dữ liệu không _UTF8đối chiếu hoặc NVARCHARdữ liệu, vì bạn có thể gặp phải hành vi / mất dữ liệu kỳ lạ. Để biết thêm chi tiết về các bộ sưu tập UTF-8 mới, vui lòng xem: Hỗ trợ UTF-8 gốc trong SQL Server 2019: Vị tiên tri cứu rỗi hay sai?


5
Mặc dù tôi đã nâng cấp điều này vì chứa quá nhiều thông tin và nỗ lực, nhưng câu trả lời của tôi chắc chắn không sai (cơ sở dữ liệu lưu trữ dữ liệu, máy chủ cơ sở dữ liệu hành động trên dữ liệu này, sắp xếp là hành động). Tôi đã chọn sự ngắn gọn về độ chính xác toán học hoàn toàn vì OP có thể đang tìm kiếm đủ, không phải tất cả thông tin có thể.
Kris

4
Xin chào @Kris. Cảm ơn. Công bằng mà nói, tôi đã không nói rằng câu trả lời của bạn là hoàn toàn sai, chỉ là không đầy đủ. Tôi đã cập nhật để hy vọng làm rõ điều đó. Tôi hiểu những gì bạn đang nói, nhưng OP đã hỏi điều COLLATEkhoản CREATE DATABASEđó là gì. Bạn đã nói một trong nhiều điều mà nó làm. Tại sao bạn cho rằng OP chỉ muốn biết 10% câu trả lời? Nếu tất cả các thông tin được trình bày, mỗi người có thể quyết định sẽ lấy bao nhiêu thông tin. Nhưng nếu chỉ có một số thông tin được đưa ra, thì sự lựa chọn đã được đưa ra cho họ. Tôi chọn cung cấp càng nhiều thông tin càng tốt vì hầu hết nó không được biết đến nhiều. (còn tiếp)
Solomon Rutzky

5
Tôi nghĩ tôi hiểu ý của bạn nhưng tôi hướng đến việc cung cấp đủ thông tin chứ không phải quá nhiều. quá nhiều thông tin nhanh chóng trở nên quá phức tạp đối với nhiều người. và khi tôi không cung cấp đủ thông tin cho bất kỳ trường hợp nào, tôi sẽ mong đợi các câu hỏi tiếp theo. (Tôi cũng không mong đợi nhiều về sự chú ý này đến chủ đề này)
Kris

8
@Kris Tôi đã có ý nghĩa trong một thời gian để nói "Cảm ơn!" cho thấy sự trưởng thành và chuyên nghiệp như vậy. Tôi có phần quen với việc mọi người phạm tội cá nhân với ai đó nói rằng họ sai, và sau đó trở nên "khó khăn" (hoặc thậm chí khó khăn hơn) để tương tác. Nhưng, câu trả lời được đo lường của bạn đối với tôi, "câu trả lời được chấp nhận là SAU " đã truyền cảm hứng cho tôi để giảm bớt phần giới thiệu của mình, và nên làm ví dụ cho những người khác ở đây về cách giao tiếp đúng đắn và hiệu quả.
Solomon Rutzky

4
Bạn được chào đón và rất vui khi biết tôi bằng cách nào đó đã tạo ra một tác động tích cực, nhưng tôi thích "sai", nó mở ra cơ hội để học những điều mới, thật tuyệt!
Kris

24

CP1 có nghĩa là 'Mã trang 1' - về mặt kỹ thuật, điều này chuyển thành mã trang 1252


16

Các đối chiếu từ khóa chỉ định những loại bộ ký tự và các quy tắc (theo thứ tự, quy tắc đối đầu), bạn đang sử dụng cho các giá trị chuỗi.

Ví dụ: trong trường hợp của bạn, bạn đang sử dụng các quy tắc Latinh với phân biệt chữ hoa chữ thường ( CI ) và phân biệt trọng âm ( AS )

Bạn có thể tham khảo Tài liệu này


9

Điều này chỉ định đối chiếu mặc định cho cơ sở dữ liệu. Mỗi trường văn bản mà bạn tạo trong các bảng trong cơ sở dữ liệu sẽ sử dụng đối chiếu đó, trừ khi bạn chỉ định một trường khác.

Một cơ sở dữ liệu luôn có một đối chiếu mặc định. Nếu bạn không chỉ định bất kỳ, đối chiếu mặc định của phiên bản SQL Server được sử dụng.

Tên của đối chiếu mà bạn sử dụng cho thấy rằng nó sử dụng mã Latin1 trang 1, không phân biệt chữ hoa chữ thường (CI) và phân biệt trọng âm (AS). Đối chiếu này được sử dụng ở Hoa Kỳ, vì vậy nó sẽ chứa các quy tắc sắp xếp được sử dụng ở Hoa Kỳ.

Đối chiếu quyết định cách so sánh các giá trị văn bản cho sự bình đẳng và giống nhau và cách chúng được so sánh khi sắp xếp. Trang mã được sử dụng khi lưu trữ dữ liệu không phải là mã unicode, ví dụ như các trường varchar.


sai (bạn không notthể chỉ định đối chiếu, mặc dù bạn có thể chấp nhận mặc định) sai (nó cũng được sử dụng cho dữ liệu unicode)
RichardTheKiwi

@Richard aka cyberkiwi: Kiểm tra tài liệu: msdn.microsoft.com/en-us/l Library / ms176061.aspx Chỉ định đối chiếu tùy chọn. Trang mã không được sử dụng để lưu trữ dữ liệu Unicode, vì nó được lưu trữ dưới dạng các điểm mã Unicode 16 bit, không phải là các chỉ mục trang mã 8 bit.
Guffa

Tôi đọc câu trả lời của bạn sai, nhưng nó vẫn sai. Một cơ sở dữ liệu luôn có đối chiếu mặc định = đối chiếu SERVER , không cụ thể Latin1_General_CI_AS. Bây giờ tôi đã đọc sai vì tôi dự đoán một nửa tuyên bố là về đối chiếu SERVER , điều này đòi hỏi phải chấp nhận mặc định trong UI. Đối với điểm thứ 2, bạn dường như ngụ ý rằng đối chiếu không được sử dụng để sắp xếp dữ liệu unicode (mặc dù bạn chuyển từ sortingsang storingtrong 2 câu cuối). Dữ liệu văn bản Unicode cũng tuân theo các đối chiếu.
RichardTheKiwi

@Richard aka cyberkiwi: Tôi đã thay đổi đoạn văn về đối chiếu mặc định để tương ứng với tài liệu cụ thể mà tôi liên kết đến. (Nó khác nhau tùy thuộc vào phiên bản của máy chủ.) Về điểm thứ hai, tôi không thể thấy cách tôi có thể làm cho nó rõ ràng hơn. Văn bản nói rằng trang mã được sử dụng khi lưu trữ dữ liệu không phải là unicode. Một trang mã không được sử dụng để xác định sắp xếp, không phải cho dữ liệu unicode cũng như cho dữ liệu không unicode.
Guffa
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.