Co robi „COLLATE SQL_Latin1_General_CP1_CI_AS”?

134

Mam zapytanie SQL do utworzenia bazy danych w SQLServer, jak podano poniżej:

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

Działa dobrze.

Podczas gdy reszta SQL jest oczywista, jestem dość zdezorientowany co do funkcjonalności COLLATE SQL_Latin1_General_CP1_CI_AS.

Czy ktoś może mi to wyjaśnić? Chciałbym też wiedzieć, czy tworzenie bazy danych w ten sposób jest dobrą praktyką?

grzmot
źródło

Odpowiedzi:

246

Określa, w jaki sposób serwer bazy danych sortuje (porównuje fragmenty tekstu). w tym przypadku:

SQL_Latin1_General_CP1_CI_AS

rozpada się na interesujące części:

  1. latin1 sprawia, że ​​serwer traktuje łańcuchy używając zestawu znaków latin 1, w zasadzie ascii
  2. CP1 oznacza stronę kodową 1252
  3. CI porównania bez rozróżniania wielkości liter, więc „ABC” równa się „abc”
  4. AS wrażliwy na akcent, więc „ü” nie równa się „u”

PS Aby uzyskać bardziej szczegółowe informacje, przeczytaj odpowiedź @ solomon-rutzky .

Kris
źródło
11
Jaka byłaby różnica między tym a SQL_Latin1_General_CI_AS. Konkretnie, CP1 sprawił , że zacząłem się zastanawiać.
Kad
7
@Kad: Wygląda na to, że nie ma pliku SQL_Latin1_General_CI_AS. Jest raczej plik Latin1_General_CI_AS. Zobacz SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. Istnieją subtelne różnice w sortowaniu i porównywaniu między dwoma zestawieniami. Zobacz olcot.co.uk/sql-blogs/… .
Riley Major
4
@Kad: CP1 to skrót od Code Page 1252. Strona kodowa to tablica przeglądowa do mapowania wartości szesnastkowej na określony znak w zestawie znaków. CP1 to skrót od CP1252 w subkulturze Microsoft. Windows jest jedyną platformą, która używa CP1252 lokalnie, ponieważ jest to pozostałość po czasach DOS. Chociaż jest bardzo podobny do ISO 8859-1, nie są one takie same. Istnieją różnice w mapowanych znakach, takich jak euro i kilka innych, których nie ma w ISO 8859-1.
slartibartfast
bezbłędna odpowiedź @Kris!
gaurav
@Kris Czy istnieje alternatywa UTF-8 dla SQL_Latin1_General_CP1_CI_AS w SQL2019?
Chanky
72

Należy pamiętać, że zaakceptowana odpowiedź jest nieco niekompletna. Tak, na najbardziej podstawowym poziomie Sortowanie obsługuje sortowanie. ALE reguły porównania zdefiniowane przez wybraną sortowanie są używane w wielu miejscach poza zapytaniami użytkowników w odniesieniu do danych użytkownika.

Jeśli "Co robi COLLATE SQL_Latin1_General_CP1_CI_AS?" oznacza „Co oznacza COLLATEklauzula CREATE DATABASEdo?”, a następnie:

COLLATE {collation_name}Klauzula CREATE DATABASEoświadczenia określa domyślnym sortowaniem w Bazie , a nie serwera; Domyślne sortowanie na poziomie bazy danych i na poziomie serwera Sortowanie kontroluje różne rzeczy.

Kontrolki na poziomie serwera (tj. Instancji) :

  • Sortowanie na poziomie bazy danych do bazy danych systemu: master, model, msdb, i tempdb.
  • Ze względu na kontrolowanie sortowania na poziomie DB tempdbjest to domyślne sortowanie dla kolumn łańcuchowych w tabelach tymczasowych (globalnych i lokalnych), ale nie dla zmiennych tabeli.
  • Ze względu na kontrolowanie sortowania na poziomie DB masterjest to sortowanie używane dla danych na poziomie serwera , takich jak nazwy baz danych (tj. nameKolumny w sys.databases), nazwy logowania itp.
  • Obsługa nazw parametrów / zmiennych
  • Obsługa nazw kursorów
  • Obsługa GOTOetykiet
  • Domyślne sortowanie używane dla nowo utworzonych baz danych, gdy COLLATEbrakuje klauzuli

Kontrolki na poziomie bazy danych :

  • Domyślnym sortowaniem wykorzystywane do nowo utworzonych kolumn strunowych ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT, i NTEXT- ale nie używają TEXTlub NTEXT) gdy COLLATEklauzula brakuje definicji kolumny. Dotyczy to zarówno oświadczeń, jak CREATE TABLEi ALTER TABLE ... ADD.
  • Domyślne sortowanie używane dla literałów łańcuchowych (tj. 'some text') I zmiennych łańcuchowych (tj @StringVariable.). To sortowanie jest używane tylko podczas porównywania łańcuchów i zmiennych z innymi ciągami i zmiennymi. Porównując ciągi / zmienne z kolumnami, zostanie użyta sortowanie kolumny.
  • Sortowanie wykorzystywane do baz danych na poziomie meta-danych, takich jak nazwy obiektów (tj sys.objects), nazwy kolumn (tj sys.columns), nazwy indeksu (tj sys.indexes), etc.
  • Sortowanie używane dla obiektów na poziomie bazy danych : tabel, kolumn, indeksów itp.

Również:

  • ASCII to 8-bitowe kodowanie (do powszechnego użytku; technicznie „ASCII” jest 7-bitowe z wartościami znaków 0–127, a „Rozszerzone ASCII” to 8-bitowe z wartościami znaków 0–255). Ta grupa jest taka sama w różnych kulturach.
  • Strona kodowa jest „rozszerzoną” częścią rozszerzonego ASCII i kontroluje, które znaki są używane dla wartości 128 - 255. Ta grupa różni się w zależności od kultury.
  • Latin1ma nie znaczyć „ASCII”, ponieważ standardowe ASCII obejmuje jedynie wartości 0 - 127, a wszystkich stron kodowych (które mogą być reprezentowane w SQL Server, a nawet NVARCHAR) Mapa te same wartości do 128 takich samych znaków.

Jeśli "Co robi COLLATE SQL_Latin1_General_CP1_CI_AS?" oznacza „Co robi to konkretne zestawienie?”, a następnie:

  • Ponieważ nazwa zaczyna się od SQL_, jest to sortowanie SQL Server, a nie sortowanie Windows. Są one zdecydowanie przestarzałe, nawet jeśli nie są oficjalnie przestarzałe, i służą głównie do zapewnienia zgodności z wersjami wcześniejszymi niż SQL Server 2000. Chociaż dość niestety SQL_Latin1_General_CP1_CI_ASjest to bardzo powszechne, ponieważ jest domyślne podczas instalacji w systemie operacyjnym używającym języka angielskiego w USA. W miarę możliwości należy unikać takich zestawień.

    Sortowania systemu Windows (te, których nazwy nie zaczynają się od SQL_) są nowsze, bardziej funkcjonalne, mają spójne sortowanie między tymi samymi wartościami VARCHARi NVARCHARdla tych samych wartości i są aktualizowane przy użyciu dodatkowych / poprawionych wag sortowania oraz odwzorowań wielkich / małych liter. Te sortowania nie mają również potencjalnego problemu z wydajnością, jaki mają sortowania SQL Server: Wpływ na indeksy podczas mieszania typów VARCHAR i NVARCHAR .

  • Latin1_General to kultura / lokalizacja.
    • Dla NCHAR, NVARCHARoraz NTEXTdane ten określa zasady językowe używane do sortowania i porównania.
    • W przypadku CHAR, VARCHARi TEXTdanych (kolumn, literałów i zmiennych) określa to:
      • reguły językowe używane do sortowania i porównywania.
      • strona kodowa używana do kodowania znaków. Na przykład Latin1_Generalsortowania używają strony kodowej 1252, Hebrewsortowania używają strony kodowej 1255 i tak dalej.
  • CP{code_page} lub {version}

    • W przypadku sortowania SQL Server :, CP{code_page}to 8-bitowa strona kodowa, która określa, jakie znaki są mapowane na wartości 128–255. Chociaż istnieją cztery strony kodowe dla zestawów znaków dwubajtowych (DBCS), które mogą używać kombinacji 2-bajtowych do tworzenia więcej niż 256 znaków, nie są one dostępne dla sortowania SQL Server.
    • W przypadku sortowania w systemie Windows : {version}chociaż nie występuje we wszystkich nazwach sortowania, odnosi się do wersji programu SQL Server, w której sortowanie zostało wprowadzone (w większości). Sortowania Windows bez numeru wersji w nazwie to wersja 80(co oznacza SQL Server 2000 jako wersję 8.0). Nie wszystkie wersje programu SQL Server są dostarczane z nowymi zestawieniami, więc w numerach wersji występują luki. Niektóre z nich są 90(dla programu SQL Server 2005, który jest w wersji 9.0), większość to 100(dla programu SQL Server 2008, wersja 10.0), a mały zestaw ma 140(dla programu SQL Server 2017 wersja 14.0).

      Powiedziałem „w większości”, ponieważ sortowania kończące się na _SCzostały wprowadzone w SQL Server 2012 (wersja 11.0), ale podstawowe dane nie były nowe, tylko dodały obsługę znaków uzupełniających dla wbudowanych funkcji. Tak więc te zakończenia istnieją dla wersji 90i 100sortowań, ale dopiero począwszy od SQL Server 2012.

  • Następnie masz wrażliwości, które mogą występować w dowolnej kombinacji poniższych, ale zawsze są określone w tej kolejności:
    • CS= rozróżniana CIwielkość liter lub = bez rozróżniania wielkości liter
    • AS= wrażliwe na AIakcent lub = niewrażliwe na akcent
    • KS = Kana uwzględniająca typ lub brakujący = Kana-niewrażliwa na typ
    • WS = zależna od szerokości lub brakująca = niewrażliwa na szerokość
    • VSS = wrażliwy selektor wariacji (dostępny tylko w wersji 140 zestawień) lub brak = selektor wariacji niewrażliwy
  • Opcjonalny ostatni element:

    • _SCna końcu oznacza „Dodatkowe wsparcie znaków”. „Wsparcie” wpływa tylko na to, jak wbudowane funkcje interpretują pary zastępcze (które są sposobem kodowania znaków uzupełniających w UTF-16). Bez _SCna końcu (lub _140_w środku) funkcje wbudowane nie widzą ani jednego dodatkowego znaku, ale zamiast tego widzą dwa bezsensowne punkty kodowe, które tworzą parę zastępczą. To zakończenie można dodać do dowolnego niebinarnego zestawienia w wersji 90 lub 100.
    • _BINlub _BIN2na końcu oznacza "binarne" sortowanie i porównywanie. Dane są nadal przechowywane tak samo, ale nie ma reguł językowych. To zakończenie nigdy nie jest łączone z żadną z 5 wrażliwości lub _SC. _BINto starszy styl i _BIN2jest to nowszy, dokładniejszy styl. Jeśli używasz SQL Server 2005 lub nowszego, użyj _BIN2. Aby uzyskać szczegółowe informacje na temat różnic między _BINi _BIN2, zobacz: Różnice między różnymi zestawieniami binarnymi (kultury, wersje i BIN a BIN2) .
    • _UTF8jest nową opcją od SQL Server 2019. Jest to 8-bitowe kodowanie, które umożliwia przechowywanie danych w formacie Unicode VARCHARi CHARtypów danych (ale nie TEXTtypu danych przestarzałego ). Tej opcji można używać tylko w przypadku zestawień obsługujących znaki uzupełniające (np. Zestawienia _SCw wersji 90 lub 100 z w nazwie i zestawienia w wersji 140). Istnieje również pojedyncze _UTF8sortowanie binarne ( _BIN2nie _BIN).

      UWAGA: UTF-8 został zaprojektowany / stworzony z myślą o kompatybilności ze środowiskami / kodami, które są skonfigurowane do kodowania 8-bitowego, ale chcą obsługiwać Unicode. Mimo że istnieje kilka scenariuszy, w których UTF-8 może zapewnić do 50% oszczędności miejsca w porównaniu do NVARCHARtego, jest to efekt uboczny i wiąże się z niewielkim spadkiem wydajności w wielu / większości operacji. Jeśli potrzebujesz tego ze względu na kompatybilność, koszt jest akceptowalny. Jeśli chcesz tego ze względu na oszczędność miejsca, lepiej przetestuj i TESTUJ PONOWNIE. Testowanie obejmuje wszystkie funkcje i nie tylko kilka wierszy danych. Ostrzegamy, że sortowanie UTF-8 działa najlepiej, gdy WSZYSTKIE kolumny i sama baza VARCHARdanych używają danych (kolumn, zmiennych, literałów łańcuchowych) z rozszerzeniem_UTF8porównanie. Jest to naturalny stan dla każdego, kto używa tego do zapewnienia kompatybilności, ale nie dla tych, którzy mają nadzieję, że wykorzystają go do oszczędności miejsca. Zachowaj ostrożność podczas mieszania danych VARCHAR przy użyciu _UTF8sortowania z VARCHARdanymi bez _UTF8sortowania lub NVARCHARdanymi, ponieważ możesz doświadczyć dziwnego zachowania / utraty danych. Aby uzyskać więcej informacji na temat nowych zestawień UTF-8, zobacz: Natywna obsługa UTF-8 w SQL Server 2019: Savior or False Prophet?

Solomon Rutzky
źródło
5
Chociaż głosowałem za tym, że zawiera tak dużo informacji i wysiłku, moja odpowiedź na pewno nie jest błędna (bazy danych przechowują dane, serwery baz danych działają na tych danych, działa sortowanie). Wybrałem zwięzłość zamiast całkowitej precyzji matematycznej, ponieważ OP prawdopodobnie szukał wystarczającej, a nie wszystkich możliwych informacji.
Kris
4
Cześć @Kris. Dzięki. Szczerze mówiąc, nie powiedziałem, że twoja odpowiedź była całkowicie błędna, po prostu żałośnie niekompletna. Mam nadzieję, że zaktualizowałem, aby to wyjaśnić. Rozumiem, co mówisz, ale OP zapytał, co robi COLLATEklauzula CREATE DATABASE. Powiedziałeś jedną z kilku rzeczy, które to robi. Dlaczego zakładasz, że PO chce znać tylko 10% odpowiedzi? Jeśli zostaną przedstawione wszystkie informacje, każda osoba może zdecydować, ile z nich zajmie. Ale jeśli podano tylko niektóre informacje, wybór został dokonany za nich. Postanawiam podać jak najwięcej informacji, ponieważ większość z nich nie jest dobrze znana. (ciąg dalszy)
Solomon Rutzky
5
Myślę, że rozumiem, co masz na myśli, ale staram się podać wystarczająco dużo informacji, a nie za dużo. zbyt wiele informacji szybko staje się zbyt skomplikowane dla wielu ludzi. a kiedy nie udzielę wystarczających informacji w jakichkolwiek okolicznościach, oczekuję dalszych pytań. (Nie spodziewałem się też aż tyle uwagi w temacie)
Kris
8
@Kris Od jakiegoś czasu chciałem powiedzieć „Dzięki!” za wykazanie się taką dojrzałością i profesjonalizmem. Jestem trochę przyzwyczajony do tego, że ludzie obrażają się na kogoś, kto mówi, że się myli, a potem staje się „trudny” (lub nawet trudniejszy) we współpracy. Ale twoja wyważona reakcja na moją „zaakceptowana odpowiedź jest NIEPRAWIDŁOWA ” zainspirowała mnie do stonowania mojego intro i powinna służyć jako przykład dla innych tutaj, jak prawidłowo i produktywnie komunikować się 😺.
Solomon Rutzky
4
Nie ma za co i miło słyszeć, że w jakiś sposób wywarłem pozytywny wpływ, ale lubię się mylić, to otwiera możliwości uczenia się nowych rzeczy, co jest świetne!
Kris
24

CP1 oznacza „stronę kodową 1” - technicznie oznacza to stronę kodową 1252

Chris Halcrow
źródło
16

UKŁADAJ słowa kluczowego określić, jaki rodzaj zestawu znaków i zasad, reguł kolejności (konfrontacja) używasz do wartości ciągów.

Na przykład w twoim przypadku używasz reguł łacińskich z rozróżnianiem wielkości liter ( CI ) i rozróżnianiem akcentu ( AS )

Możesz zapoznać się z tą dokumentacją

il_guru
źródło
9

Określa to domyślne sortowanie dla bazy danych. Każde pole tekstowe utworzone w tabelach w bazie danych będzie używać tego sortowania, chyba że określisz inne.

Baza danych zawsze ma domyślne sortowanie. Jeśli nie określisz żadnego, używane jest domyślne sortowanie wystąpienia SQL Server.

Nazwa sortowania, którego używasz, pokazuje, że używa strony kodowej Latin1 1, nie rozróżnia wielkości liter (CI) i rozróżnia akcent (AS). To zestawienie jest używane w USA, więc będzie zawierało zasady sortowania używane w USA.

Sortowanie decyduje o tym, jak wartości tekstowe są porównywane pod kątem równości i podobieństwa oraz jak są porównywane podczas sortowania. Strona kodowa jest używana do przechowywania danych innych niż Unicode, np. Pól varchar.

Guffa
źródło
źle (nie możesz notokreślić sortowania, chociaż możesz zaakceptować wartość domyślną) źle (jest używane również dla danych Unicode)
RichardTheKiwi
@Richard aka cyberkiwi: Sprawdź dokumentację: msdn.microsoft.com/en-us/library/ms176061.aspx Określenie sortowania jest opcjonalne. Strona kodowa nie jest używana do przechowywania danych Unicode, ponieważ są one przechowywane jako 16-bitowe punkty kodowe Unicode, a nie jako 8-bitowe indeksy stron kodowych.
Guffa
Przeczytałem twoją odpowiedź źle, ale nadal jest błędna. Baza danych zawsze ma domyślne sortowanie = sortowanie SERWER , a nie konkretnie Latin1_General_CI_AS. Teraz źle to odczytałem, ponieważ w połowie spodziewałem się, że stwierdzenie będzie dotyczyło sortowania SERWERA, co wymaga akceptacji domyślnej wartości w interfejsie użytkownika. Jeśli chodzi o drugi punkt, wydaje się , że sugerujesz, że sortowanie nie jest używane do sortowania danych Unicode (nawet jeśli przełączasz się z sortingna storingw ostatnich 2 zdaniach). Dane tekstowe Unicode również podlegają sortowaniu.
RichardTheKiwi
@Richard aka cyberkiwi: Zmieniłem akapit dotyczący domyślnego sortowania, aby odpowiadał konkretnej dokumentacji, do której dołączyłem. (Różni się w zależności od wersji serwera). Jeśli chodzi o drugi punkt, nie widzę, jak mógłbym to wyjaśnić. Tekst mówi, że strona kodowa jest używana podczas przechowywania danych innych niż Unicode. Strona kodowa nie jest używana do określenia sortowania, ani dla danych Unicode, ani dla danych innych niż Unicode.
Guffa