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ą?
sql-server
database
tsql
collation
grzmot
źródło
źródło
SQL_Latin1_General_CI_AS
. Konkretnie, CP1 sprawił , że zacząłem się zastanawiać.SQL_Latin1_General_CI_AS
. Jest raczej plikLatin1_General_CI_AS
. ZobaczSELECT * 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/… .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 oznaczaCOLLATE
klauzulaCREATE DATABASE
do?”, a następnie:COLLATE {collation_name}
KlauzulaCREATE DATABASE
oś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) :
master
,model
,msdb
, itempdb
.tempdb
jest to domyślne sortowanie dla kolumn łańcuchowych w tabelach tymczasowych (globalnych i lokalnych), ale nie dla zmiennych tabeli.master
jest to sortowanie używane dla danych na poziomie serwera , takich jak nazwy baz danych (tj.name
Kolumny wsys.databases
), nazwy logowania itp.GOTO
etykietCOLLATE
brakuje klauzuliKontrolki na poziomie bazy danych :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
, iNTEXT
- ale nie używająTEXT
lubNTEXT
) gdyCOLLATE
klauzula brakuje definicji kolumny. Dotyczy to zarówno oświadczeń, jakCREATE TABLE
iALTER TABLE ... ADD
.'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.sys.objects
), nazwy kolumn (tjsys.columns
), nazwy indeksu (tjsys.indexes
), etc.Również:
Latin1
ma 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 nawetNVARCHAR
) 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ść niestetySQL_Latin1_General_CP1_CI_AS
jest 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ściamiVARCHAR
iNVARCHAR
dla 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.NCHAR
,NVARCHAR
orazNTEXT
dane ten określa zasady językowe używane do sortowania i porównania.CHAR
,VARCHAR
iTEXT
danych (kolumn, literałów i zmiennych) określa to:Latin1_General
sortowania używają strony kodowej 1252,Hebrew
sortowania używają strony kodowej 1255 i tak dalej.CP{code_page}
lub{version}
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 wersja80
(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ść to100
(dla programu SQL Server 2008, wersja 10.0), a mały zestaw ma140
(dla programu SQL Server 2017 wersja 14.0).Powiedziałem „w większości”, ponieważ sortowania kończące się na
_SC
został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 wersji90
i100
sortowań, ale dopiero począwszy od SQL Server 2012.CS
= rozróżnianaCI
wielkość liter lub = bez rozróżniania wielkości literAS
= wrażliwe naAI
akcent lub = niewrażliwe na akcentKS
= Kana uwzględniająca typ lub brakujący = Kana-niewrażliwa na typWS
= 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żliwyOpcjonalny ostatni element:
_SC
na 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_SC
na 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._BIN
lub_BIN2
na 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
._BIN
to starszy styl i_BIN2
jest 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_BIN
i_BIN2
, zobacz: Różnice między różnymi zestawieniami binarnymi (kultury, wersje i BIN a BIN2) ._UTF8
jest nową opcją od SQL Server 2019. Jest to 8-bitowe kodowanie, które umożliwia przechowywanie danych w formacie UnicodeVARCHAR
iCHAR
typów danych (ale nieTEXT
typu danych przestarzałego ). Tej opcji można używać tylko w przypadku zestawień obsługujących znaki uzupełniające (np. Zestawienia_SC
w wersji 90 lub 100 z w nazwie i zestawienia w wersji 140). Istnieje również pojedyncze_UTF8
sortowanie binarne (_BIN2
nie_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
NVARCHAR
tego, 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 bazaVARCHAR
danych używają danych (kolumn, zmiennych, literałów łańcuchowych) z rozszerzeniem_UTF8
poró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_UTF8
sortowania zVARCHAR
danymi bez_UTF8
sortowania lubNVARCHAR
danymi, 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?źródło
COLLATE
klauzulaCREATE 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)CP1 oznacza „stronę kodową 1” - technicznie oznacza to stronę kodową 1252
źródło
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ą
źródło
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.
źródło
not
określić sortowania, chociaż możesz zaakceptować wartość domyślną) źle (jest używane również dla danych Unicode)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ę zsorting
nastoring
w ostatnich 2 zdaniach). Dane tekstowe Unicode również podlegają sortowaniu.