Obsługa sortowania i unicode
Dotyczy:programu SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft Fabric
Sortowania w programie SQL Server definiują reguły sortowania oraz czułość na wielkość liter i akcenty dla danych. Sortowania używane z typami danych znakowych, takimi jak char i varchar, określają stronę kodową oraz znaki, które dany typ danych może reprezentować.
Niezależnie od tego, czy instalujesz nowe wystąpienie programu SQL Server, przywracasz kopię zapasową bazy danych, czy łączysz serwer z bazami danych klienckimi, ważne jest, aby zrozumieć wymagania dotyczące ustawień regionalnych, kolejność sortowania oraz wrażliwość na wielkość liter i akcenty danych, z którymi pracujesz. Aby wyświetlić listę sortowania dostępnych na instancji programu SQL Server, zobacz sys.fn_helpcollations.
Po wybraniu sortowania dla serwera, bazy danych, kolumny lub wyrażenia przypisujesz pewne cechy do danych. Te cechy wpływają na wyniki wielu operacji w bazie danych. Na przykład podczas konstruowania zapytania przy użyciu ORDER BY
kolejność sortowania zestawu wyników może zależeć od sortowania zastosowanego do bazy danych lub określonego w klauzuli COLLATE
na poziomie wyrażenia zapytania.
Aby najlepiej używać obsługi sortowania w programie SQL Server, należy zrozumieć terminy zdefiniowane w tym artykule i sposób ich powiązania z cechami danych.
Terminy sortowania
-
sortowania
- zestawy sortowania
- poziomy sortowania
- ustawienia regionalne
- strona kodowa
- Kolejność sortowania
Sortowanie
Sortowanie określa wzorce bitów reprezentujące każdy znak w zestawie danych. Sortowania określają również zasady porządkowania i porównywania danych. Program SQL Server obsługuje przechowywanie obiektów, które mają różne sortowania w pojedynczej bazie danych. W przypadku kolumn innych niż Unicode ustawienie sortowania określa stronę kodową danych i znaki, które mogą być reprezentowane. Dane przenoszone między kolumnami innych niż Unicode muszą zostać przekonwertowane ze strony kodu źródłowego na docelową stronę kodową.
Transact-SQL wyniki instrukcji mogą się różnić, gdy instrukcja jest uruchamiana w kontekście różnych baz danych, które mają różne ustawienia sortowania. Jeśli to możliwe, użyj ustandaryzowanego sortowania dla Twojej organizacji. W ten sposób nie trzeba określać sortowania w każdym znaku lub wyrażeniu Unicode. Jeśli musisz pracować z obiektami, które mają różne ustawienia sortowania i strony kodowej, należy kodować zapytania, aby wziąć pod uwagę reguły pierwszeństwa sortowania. Aby uzyskać więcej informacji, zobacz priorytet sortowania.
Opcje skojarzone z sortowaniem to czułość wielkości liter, czułość akcentu, czułość kana, czułość szerokości i czułość selektora odmiany. Program SQL Server 2019 (15.x) wprowadza dodatkową opcję kodowania UTF-8.
Te opcje można określić, dołączając je do nazwy sortowania. Na przykład porządkowanie Japanese_Bushu_Kakusu_100_CS_AS_KS_WS_SC_UTF8
rozróżnia wielkość liter, uwzględnia akcenty, rozróżnia znaki kana, rozróżnia szerokość i jest kodowane w UTF-8. Przykładowo, sortowanie Japanese_Bushu_Kakusu_140_CI_AI_KS_WS_VSS
ignoruje wielkość liter, ignoruje akcenty, rozróżnia kana, uwzględnia szerokość, czułość na selektor odmiany i używa starszej strony kodowej dla varchar.
Zachowanie skojarzone z tymi różnymi opcjami opisano w poniższej tabeli:
Opcja | Opis |
---|---|
Uwzględnianie wielkości liter (_CS) | Rozróżnia wielkie i małe litery. Jeśli ta opcja jest zaznaczona, małe litery są sortowane przed ich wielkimi wersjami. Jeśli ta opcja nie jest zaznaczona, sortowanie jest bez uwzględniania wielkości liter. Oznacza to, że program SQL Server uważa, że wielkie i małe wersje liter są identyczne do celów sortowania. Można jawnie wybrać opcję ignorowania wielkości liter, określając _CI. |
Wrażliwe na akcent (_AS) | Rozróżnia znaki z akcentem i bez akcentu. Na przykład a nie jest równa ấ . Jeśli ta opcja nie jest zaznaczona, sortowanie jest niewrażliwe na akcent. Oznacza to, że SQL Server uważa akcentowane i nieakcentowane wersje liter za identyczne do celów sortowania. Możesz jawnie wybrać niewrażliwość na akcent, określając _AI. |
Wrażliwe na kanę (_KS) | Rozróżnia dwa typy japońskich znaków kana: Hiragana i Katakana. Jeśli ta opcja nie jest zaznaczona, sortowanie ignoruje znaki kana. Oznacza to, że program SQL Server uważa znaki Hiragana i Katakana za równe dla celów sortowania. Pominięcie tej opcji jest jedyną metodą określania niewrażliwości kana. |
Wrażliwy na szerokość (_WS) | Rozróżnia znaki o pełnej szerokości i pół szerokości. Jeśli ta opcja nie jest zaznaczona, SQL Server uważa reprezentację w pełnej i połowicznej szerokości tego samego znaku za identyczną do celów sortowania. Pominięcie tej opcji jest jedyną metodą określania niewrażliwości na szerokość. |
Rozróżniana przez selektor odmiany (_VSS) | Rozróżnia różne selektory odmian ideograficznych w japońskich kolacjach Japanese_Bushu_Kakusu_140 i Japanese_XJIS_140 , które zostały wprowadzone w programie SQL Server 2017 (14.x). Sekwencja odmian składa się z znaku podstawowego oraz selektora odmiany. Jeśli ta opcja _VSS nie jest zaznaczona, sortowanie jest niewrażliwe na selektor odmiany, a selektor odmiany nie jest brany pod uwagę w porównaniu. Oznacza to, że program SQL Server uwzględnia znaki utworzone na podstawie tego samego znaku podstawowego z różnymi selektorami odmian, które mają być identyczne do celów sortowania. Aby uzyskać więcej informacji, zobacz Baza danych ideograficznych wariantów Unicode.Sortowania z uwzględnieniem selektora odmian (_VSS) nie są obsługiwane w indeksach wyszukiwania pełnotekstowego. Indeksy wyszukiwania pełnotekstowego obsługują tylko opcje Accent-Sensitive (_AS), kana-sensitive (_KS) i Width-sensitive (_WS). Silniki integracyjne SQL Server XML i środowiska uruchomieniowego języka wspólnego (CLR) nie obsługują selektorów odmian (_VSS). |
Plik binarny (_BIN) 1 | Sortuje i porównuje dane w tabelach programu SQL Server na podstawie wzorców bitów zdefiniowanych dla każdego znaku. Kolejność sortowania binarnego jest wrażliwa na wielkość liter i akcenty. Kolejność binarna jest również najszybszą metodą sortowania. Aby uzyskać więcej informacji, zobacz sekcję sortowania binarnego w tym artykule. |
Punkt kodu binarnego (_BIN2) 1 | Sortuje i porównuje dane w tabelach programu SQL Server na podstawie punktów kodu Unicode dla danych Unicode. W przypadku danych innych niż Unicode punkt kodu binarnego używa porównań, które są identyczne z tymi dla sortowania binarnego. Zaletą używania kolejności sortowania według kodu binarnego jest to, że w aplikacjach, które porównują posortowane dane w programie SQL Server, nie jest wymagane ponowne sortowanie danych. W rezultacie kolejność sortowania punktów kodu binarnego zapewnia prostszy rozwój aplikacji i możliwe zwiększenie wydajności. Aby uzyskać więcej informacji, zobacz sekcję sortowania binarnego w tym artykule. |
UTF-8 (_UTF8) | Umożliwia przechowywanie danych zakodowanych w formacie UTF-8 w programie SQL Server. Jeśli ta opcja nie jest zaznaczona, program SQL Server używa domyślnego formatu kodowania innego niż Unicode dla odpowiednich typów danych. Aby uzyskać więcej informacji, zobacz sekcję wsparcia dla UTF-8 w tym artykule. |
1 Jeśli wybrano kod binarny lub binarny, opcje Uwzględnianie wielkości liter (_CS), Uwzględnianie akcentu (_AS), Kana (_KS) i Uwzględnianie szerokości (_WS) nie są dostępne.
Przykłady opcji sortowania
Każde sortowanie jest łączone jako seria sufiksów definiujących wielkość liter, akcent, szerokość lub czułość kana. W poniższych przykładach opisano zachowanie kolejności sortowania dla różnych kombinacji sufiksów.
Sufiks sortowania systemu Windows | Opis kolejności sortowania |
---|---|
_BIN 1 | Sortowanie binarne |
_BIN2 1, 2 | Kolejność sortowania punktów kodu binarnego |
_CI_AI 2 | Bez uwzględniania wielkości liter, bez uwzględniania akcentu, bez uwzględniania kana, bez uwzględniania szerokości |
_CI_AI_KS 2 | Bez uwzględniania wielkości liter, bez uwzględniania akcentu, z uwzględnieniem kany, bez uwzględniania szerokości |
_CI_AI_KS_WS 2 | Bez uwzględniania wielkości liter, bez uwzględniania akcentu, rozróżniająca się pod względem kana, rozróżniająca się pod względem szerokości |
_CI_AI_WS 2 | Niewrażliwe na wielkość liter, niewrażliwe na akcent, niewrażliwe na kana, wrażliwe na szerokość |
_CI_AS 2 | Bez uwzględniania wielkości liter, z uwzględnieniem akcentu, bez uwzględniania kana, niewrażliwego na szerokość |
_CI_AS_KS 2 | Niewrażliwa na wielkość liter, uwzględnianie akcentów, rozróżniana kana, niewrażliwa na różnice szerokości |
_CI_AS_KS_WS 2 | Bez uwzględnienia wielkości liter, wrażliwość na akcent, wrażliwość na kana, wrażliwość na szerokość |
_CI_AS_WS 2 | Niewrażliwe na wielkość liter, wrażliwe na akcent, niewrażliwe na kanę, wrażliwe na szerokość |
_CS_AI 2 | Uwzględniana wielkość liter, bez uwzględniania akcentów, niewrażliwa na kana, bez uwzględniania szerokości |
_CS_AI_KS 2 | Wrażliwa na wielkość liter, niewrażliwa na akcent, wrażliwa na kana, niewrażliwa na szerokość |
_CS_AI_KS_WS 2 | Uwzględniana wielkość liter, bez uwzględniania akcentu, wrażliwa na kana, rozróżniana szerokość |
_CS_AI_WS 2 | Wrażliwa na wielkość liter, niewrażliwa na akcenty, niewrażliwa na kana, wrażliwa na szerokość |
_CS_AS 2 | Wrażliwa na wielkość liter, wrażliwa na akcenty, niewrażliwa na znaki kana, niewrażliwa na szerokość |
_CS_AS_KS 2 | Wrażliwy na wielkość liter, wrażliwy na akcenty, wrażliwy na kana, niewrażliwy na szerokość |
_CS_AS_KS_WS 2 | Wrażliwa na wielkość liter, wrażliwa na akcent, wrażliwa na kana, wrażliwa na szerokość |
_CS_AS_WS 2 | Wrażliwa na wielkość liter, wrażliwa na akcenty, niewrażliwa na kana, wrażliwa na szerokość |
1 Jeśli wybrano kod binarny lub binarny, opcje Uwzględnianie wielkości liter (_CS), Uwzględnianie akcentu (_AS), Kana (_KS) i Uwzględnianie szerokości (_WS) nie są dostępne.
2 Dodawanie opcji UTF-8 (_UTF8) umożliwia kodowanie danych Unicode przy użyciu protokołu UTF-8. Aby uzyskać więcej informacji, zobacz sekcję wsparcia dla UTF-8 w tym artykule.
Zestawy sortowania
Program SQL Server obsługuje następujące zestawy sortowania:
Sortowania systemu Windows
Sortowania systemu Windows określają zasady dotyczące przechowywania danych znakowych, które są oparte na powiązanym lokalizatorze systemowym Windows. W przypadku sortowania systemu Windows można zaimplementować porównanie danych innych niż Unicode przy użyciu tego samego algorytmu co w przypadku danych Unicode. Podstawowe reguły sortowania systemu Windows określają, który alfabet lub język jest używany podczas sortowania słownika. Reguły określają również stronę kodową używaną do przechowywania danych znaków innych niż Unicode. Sortowanie Unicode i nie-Unicode są zgodne w porównaniach ciągów w określonej wersji Systemu Windows. Zapewnia to spójność między typami danych w programie SQL Server i umożliwia deweloperom sortowanie ciągów w aplikacjach przy użyciu tych samych reguł, które są używane przez program SQL Server. Aby uzyskać więcej informacji, zobacz nazwę sortowania systemu Windows.
Sortowania binarne
Sortowania binarne sortują dane na podstawie sekwencji zakodowanych wartości zdefiniowanych przez ustawienia regionalne i typ danych. Uwzględniana jest wielkość liter. Sortowanie binarne w programie SQL Server definiuje ustawienia regionalne i stronę kodową ANSI, która jest używana. Wymusza to binarną kolejność sortowania. Ponieważ są one stosunkowo proste, sortowania binarne pomagają zwiększyć wydajność aplikacji. W przypadku typów danych innych niż Unicode porównania danych są oparte na punktach kodu zdefiniowanych na stronie kodowej ANSI. W przypadku typów danych Unicode porównania danych są oparte na punktach kodu Unicode. W przypadku sortowania binarnego w typach danych Unicode ustawienia regionalne nie są uwzględniane w sortowaniu danych. Na przykład Latin1_General_BIN
i Japanese_BIN
dają identyczne wyniki sortowania, gdy są używane na danych Unicode. Aby uzyskać więcej informacji, zobacz nazwę sortowania systemu Windows.
Istnieją dwa typy sortowania binarnego w programie SQL Server:
Starsze sortowania
BIN
, które wykonały niekompletne porównanie punkt-punkt-kod dla danych Unicode. Starsze sortowania binarne porównywały pierwszy znak jako WCHAR, a następnie bajt po bajcie. W sortowaniu BIN tylko pierwszy znak jest sortowany zgodnie z punktem kodu, a pozostałe znaki są sortowane zgodnie z ich wartościami bajtów.Nowsze sortowania
BIN2
, które implementują czyste porównanie punktów kodu. W sortowaniu BIN2 wszystkie znaki są sortowane zgodnie z ich punktami kodu. Ponieważ platforma Intel jest architekturą little endian, znaki kodu Unicode są zawsze przechowywane jako przestawione bajty.
Sortowania programu SQL Server
Sortowania w programie SQL Server (SQL_*) zapewniają zgodność kolejności sortowania z wcześniejszymi wersjami SQL Server. Reguły sortowania słowników dla danych innych niż Unicode są niezgodne z dowolną procedurą sortowania dostarczaną przez systemy operacyjne Windows. Jednak sortowanie danych Unicode jest zgodne z określoną wersją reguł sortowania systemu Windows. Ponieważ sortowania programu SQL Server używają różnych reguł porównania dla danych innych niż Unicode i Unicode, są widoczne różne wyniki dla porównań tych samych danych, w zależności od bazowego typu danych.
Jeśli na przykład używasz sortowania SQL SQL_Latin1_General_CP1_CI_AS
, ciąg nie-Unicode 'a-c'
jest mniejszy niż ciąg 'ab'
, ponieważ łącznik (-
) jest sortowany jako osobny znak, który występuje przed b
. Jeśli jednak przekonwertujesz te ciągi na Unicode i wykonasz to samo porównanie, ciąg Unicode N'a-c'
jest uważany za większy niż N'ab'
, ponieważ reguły sortowania Unicode używają sortowania wyrazów, które ignorują łącznik.
Aby uzyskać więcej informacji, zapoznaj się z nazwą sortowania SQL Server .
Podczas instalacji programu SQL Server domyślne ustawienie sortowania instalacji jest określane przez ustawienia regionalne systemu operacyjnego. Sortowanie na poziomie serwera można zmienić podczas instalacji lub zmieniając ustawienia regionalne systemu operacyjnego przed instalacją. Ze względów kompatybilności wstecznej sortowanie domyślne jest ustawione na najstarszą dostępną wersję skojarzoną z poszczególnymi ustawieniami lokalnymi. W związku z tym nie zawsze jest to zalecane sortowanie. Aby w pełni korzystać z funkcji programu SQL Server, zmień domyślne ustawienia instalacji, aby używać sortowania systemu Windows. Na przykład dla ustawień regionalnych systemu operacyjnego "Angielski (Stany Zjednoczone)" (strona kodowa 1252), domyślne sortowanie podczas instalacji jest SQL_Latin1_General_CP1_CI_AS
, i można go zmienić na jego najbliższy odpowiednik sortowania systemu Windows, Latin1_General_100_CI_AS_SC
.
Podczas uaktualniania wystąpienia programu SQL Server w języku angielskim można określić sortowania programu SQL Server (SQL_*) pod kątem zgodności z istniejącymi wystąpieniami programu SQL Server. Ponieważ podczas instalacji zdefiniowano domyślne sortowanie dla wystąpienia programu SQL Server, upewnij się, że ustawienia sortowania zostały dokładnie określone, gdy spełnione są następujące warunki:
- Kod aplikacji zależy od zachowania poprzednich sortowania programu SQL Server.
- Musisz przechowywać dane znaków odzwierciedlające wiele języków.
Poziomy sortowania
Sortowania ustawień są obsługiwane na następujących poziomach wystąpienia programu SQL Server:
- ustawienia sortowania na poziomie serwera
- Zestawienia na poziomie bazy danych
- sortowania na poziomie kolumny
- sortowania na poziomie wyrażeń
Sortowania na poziomie serwera
Sortowanie serwera domyślnego jest określane podczas instalacji programu SQL Server i staje się domyślnym sortowaniem systemowych baz danych i wszystkich baz danych użytkowników.
W poniższej tabeli przedstawiono domyślne oznaczenia sortowania określone przez ustawienia regionalne systemu operacyjnego, w tym identyfikatory kodu języka (LCID) dla Windows i SQL.
Ustawienia regionalne systemu Windows | Windows LCID | SQL LCID | Sortowanie domyślne |
---|---|---|---|
Afrikaans (Republika Południowej Afryki) | 0x0436 | 0x0409 | Latin1_General_CI_AS |
Albański (Albania) | 0x041c | 0x041c | Albanian_CI_AS |
Alsatian (Francja) | 0x0484 | 0x0409 | Latin1_General_CI_AS |
Amharic (Etiopia) | 0x045e | 0x0409 | Latin1_General_CI_AS |
Arabski (Algieria) | 0x1401 | 0x0401 | Arabic_CI_AS |
Arabski (Bahrajn) | 0x3c01 | 0x0401 | Arabic_CI_AS |
Arabski (Egipt) | 0x0c01 | 0x0401 | Arabic_CI_AS |
Arabski (Irak) | 0x0801 | 0x0401 | Arabic_CI_AS |
Arabski (Jordania) | 0x2c01 | 0x0401 | Arabic_CI_AS |
Arabski (Kuwejt) | 0x3401 | 0x0401 | Arabic_CI_AS |
Arabski (Liban) | 0x3001 | 0x0401 | Arabic_CI_AS |
Arabski (Libia) | 0x1001 | 0x0401 | Arabic_CI_AS |
Arabski (Maroko) | 0x1801 | 0x0401 | Arabic_CI_AS |
Arabski (Oman) | 0x2001 | 0x0401 | Arabic_CI_AS |
Arabski (Katar) | 0x4001 | 0x0401 | Arabic_CI_AS |
Arabski (Arabia Saudyjska) | 0x0401 | 0x0401 | Arabic_CI_AS |
Arabski (Syria) | 0x2801 | 0x0401 | Arabic_CI_AS |
Arabski (Tunezja) | 0x1c01 | 0x0401 | Arabic_CI_AS |
Arabski (U.A.E.) | 0x3801 | 0x0401 | Arabic_CI_AS |
Arabski (Jemen) | 0x2401 | 0x0401 | Arabic_CI_AS |
Ormiański (Armenia) | 0x042b | 0x0419 | Latin1_General_CI_AS |
Assamese (Indie) | 0x044d | 0x044d | Niedostępne na poziomie serwera |
Azerbejdżański (Azerbejdżan, Cyrylica) | 0x082c | 0x082c | Przestarzałe, niedostępne na poziomie serwera |
Azerbejdżański (Azerbejdżan, Łaciński) | 0x042c | 0x042c | Przestarzałe, niedostępne na poziomie serwera |
Bashkir (Rosja) | 0x046d | 0x046d | Latin1_General_CI_AI |
Baskijski (baskijski) | 0x042d | 0x0409 | Latin1_General_CI_AS |
Białorusin (Białoruś) | 0x0423 | 0x0419 | Cyrillic_General_CI_AS |
Bangla (Bangladesz) | 0x0845 | 0x0445 | Niedostępne na poziomie serwera |
Bengalski (Indie) | 0x0445 | 0x0439 | Niedostępne na poziomie serwera |
Bośniacki (Bośnia i Hercegowina, cyrylica) | 0x201a | 0x201a | Latin1_General_CI_AI |
Bośniacki (Bośnia i Hercegowina, Łaciński) | 0x141a | 0x141a | Latin1_General_CI_AI |
Breton (Francja) | 0x047e | 0x047e | Latin1_General_CI_AI |
Bułgarski (Bułgaria) | 0x0402 | 0x0419 | Cyrillic_General_CI_AS |
Kataloński (kataloński) | 0x0403 | 0x0409 | Latin1_General_CI_AS |
Chiński (Hongkong, Specjalny Region Administracyjny, ChRL) | 0x0c04 | 0x0404 | Chinese_Taiwan_Stroke_CI_AS |
Chiński (Makao SAR) | 0x1404 | 0x1404 | Latin1_General_CI_AI |
Chiński (Makao SAR) | 0x21404 | 0x21404 | Latin1_General_CI_AI |
Chiński (ChRL) | 0x0804 | 0x0804 | Chinese_PRC_CI_AS |
Chiński (ChRL) | 0x20804 | 0x20804 | Chinese_PRC_Stroke_CI_AS |
Chiński (Singapur) | 0x1004 | 0x0804 | Chinese_PRC_CI_AS |
Chiński (Singapur) | 0x21004 | 0x20804 | Chinese_PRC_Stroke_CI_AS |
Chiński (Tajwan) | 0x30404 | 0x30404 | Chinese_Tajwan_Bopomofo_CI_AS |
Chiński (Tajwan) | 0x0404 | 0x0404 | Chinese_Taiwan_Stroke_CI_AS |
Korsykan (Francja) | 0x0483 | 0x0483 | Latin1_General_CI_AI |
Chorwacki (Bośnia i Hercegowina, Łaciński) | 0x101a | 0x041a | Croatian_CI_AS |
Chorwacki (Chorwacja) | 0x041a | 0x041a | Croatian_CI_AS |
Czeski (Czechy) | 0x0405 | 0x0405 | Czech_CI_AS |
Duński (Dania) | 0x0406 | 0x0406 | Danish_Norwegian_CI_AS |
Dari (Afganistan) | 0x048c | 0x048c | Latin1_General_CI_AI |
Divehi (Malediwy) | 0x0465 | 0x0465 | Niedostępne na poziomie serwera |
Holenderski (Belgia) | 0x0813 | 0x0409 | Latin1_General_CI_AS |
Niderlandzki (Holandia) | 0x0413 | 0x0409 | Latin1_General_CI_AS |
Angielski (Australia) | 0x0c09 | 0x0409 | Latin1_General_CI_AS |
Angielski (Belize) | 0x2809 | 0x0409 | Latin1_General_CI_AS |
Angielski (Kanada) | 0x1009 | 0x0409 | Latin1_General_CI_AS |
Angielski (Karaiby) | 0x2409 | 0x0409 | Latin1_General_CI_AS |
Angielski (Indie) | 0x4009 | 0x0409 | Latin1_General_CI_AS |
Angielski (Irlandia) | 0x1809 | 0x0409 | Latin1_General_CI_AS |
Angielski (Jamajka) | 0x2009 | 0x0409 | Latin1_General_CI_AS |
Angielski (Malezja) | 0x4409 | 0x0409 | Latin1_General_CI_AS |
Angielski (Nowa Zelandia) | 0x1409 | 0x0409 | Latin1_General_CI_AS |
Angielski (Filipiny) | 0x3409 | 0x0409 | Latin1_General_CI_AS |
Angielski (Singapur) | 0x4809 | 0x0409 | Latin1_General_CI_AS |
Angielski (Republika Południowej Afryki) | 0x1c09 | 0x0409 | Latin1_General_CI_AS |
Angielski (Trynidad i Tobago) | 0x2c09 | 0x0409 | Latin1_General_CI_AS |
Angielski (Wielka Brytania) | 0x0809 | 0x0409 | Latin1_General_CI_AS |
Angielski (Stany Zjednoczone) | 0x0409 | 0x0409 | SQL_Latin1_General_CP1_CI_AS |
Angielski (Zimbabwe) | 0x3009 | 0x0409 | Latin1_General_CI_AS |
Język estoński (Estonia) | 0x0425 | 0x0425 | Estonian_CI_AS |
Język farerski (Wyspy Owcze) | 0x0438 | 0x0409 | Latin1_General_CI_AS |
Język filipiński (Filipiny) | 0x0464 | 0x0409 | Latin1_General_CI_AS |
Fiński (Finlandia) | 0x040b | 0x040b | Finnish_Swedish_CI_AS |
Francuski (Belgia) | 0x080c | 0x040c | French_CI_AS |
Francuski (Kanada) | 0x0c0c | 0x040c | French_CI_AS |
Francuski (Francja) | 0x040c | 0x040c | French_CI_AS |
Francuski (Luksemburg) | 0x140c | 0x040c | French_CI_AS |
Francuski (Monako) | 0x180c | 0x040c | French_CI_AS |
Francuski (Szwajcaria) | 0x100c | 0x040c | French_CI_AS |
Frisian (Holandia) | 0x0462 | 0x0462 | Latin1_General_CI_AI |
Galicyjski | 0x0456 | 0x0409 | Latin1_General_CI_AS |
Gruziński (Georgia) | 0x10437 | 0x10437 | Georgian_Modern_Sort_CI_AS |
Gruziński (Georgia) | 0x0437 | 0x0419 | Latin1_General_CI_AS |
Niemiecki — Sortowanie książek telefonicznych (DIN) | 0x10407 | 0x10407 | German_PhoneBook_CI_AS |
Niemiecki (Austria) | 0x0c07 | 0x0409 | Latin1_General_CI_AS |
Niemiecki (Niemcy) | 0x0407 | 0x0409 | Latin1_General_CI_AS |
Niemiecki (Liechtenstein) | 0x1407 | 0x0409 | Latin1_General_CI_AS |
Niemiecki (Luksemburg) | 0x1007 | 0x0409 | Latin1_General_CI_AS |
Niemiecki (Szwajcaria) | 0x0807 | 0x0409 | Latin1_General_CI_AS |
Grecki (Grecja) | 0x0408 | 0x0408 | Greek_CI_AS |
Grenlandzki (Grenlandia) | 0x046f | 0x0406 | Danish_Norwegian_CI_AS |
Gujarati (Indie) | 0x0447 | 0x0439 | Niedostępne na poziomie serwera |
Hausa (Nigeria, Łacińska) | 0x0468 | 0x0409 | Latin1_General_CI_AS |
Hebrajski (Izrael) | 0x040d | 0x040d | Hebrew_CI_AS |
Hindi (Indie) | 0x0439 | 0x0439 | Niedostępne na poziomie serwera |
Węgierski (Węgry) | 0x040e | 0x040e | Hungarian_CI_AS |
Węgierskie sortowanie techniczne | 0x1040e | 0x1040e | Hungarian_Technical_CI_AS |
Islandzki (Islandia) | 0x040f | 0x040f | Icelandic_CI_AS |
Igbo (Nigeria) | 0x0470 | 0x0409 | Latin1_General_CI_AS |
Indonezyjski (Indonezja) | 0x0421 | 0x0409 | Latin1_General_CI_AS |
Inuktitut (Kanada, alfabet łaciński) | 0x085d | 0x0409 | Latin1_General_CI_AS |
Inuktitut (Syllabics) Kanada | 0x045d | 0x045d | Latin1_General_CI_AI |
Irlandzki (Irlandia) | 0x083c | 0x0409 | Latin1_General_CI_AS |
Włoski (Włochy) | 0x0410 | 0x0409 | Latin1_General_CI_AS |
Włoski (Szwajcaria) | 0x0810 | 0x0409 | Latin1_General_CI_AS |
Japoński (Japonia XJIS) | 0x0411 | 0x0411 | Japanese_CI_AS |
Japoński (Japonia) | 0x040411 | 0x40411 | Latin1_General_CI_AI |
Kannada (Indie) | 0x044b | 0x0439 | Niedostępne na poziomie serwera |
kazachski (Kazachstan) | 0x043f | 0x043f | Kazakh_90_CI_AS |
Khmer (Kambodża) | 0x0453 | 0x0453 | Niedostępne na poziomie serwera |
K'iche (Gwatemala) | 0x0486 | 0x0c0a | Modern_Spanish_CI_AS |
Kinyarwanda (Rwanda) | 0x0487 | 0x0409 | Latin1_General_CI_AS |
Konkani (Indie) | 0x0457 | 0x0439 | Niedostępne na poziomie serwera |
Koreański (Sortowanie w słowniku koreańskim) | 0x0412 | 0x0412 | Korean_Wansung_CI_AS |
Kirgizja (Kirgistan) | 0x0440 | 0x0419 | Cyrillic_General_CI_AS |
Lao (Lao PDR) | 0x0454 | 0x0454 | Niedostępne na poziomie serwera |
Łotewski (Łotwa) | 0x0426 | 0x0426 | Latvian_CI_AS |
Litewski (Litwa) | 0x0427 | 0x0427 | Lithuanian_CI_AS |
Dolna Łużysta (Niemcy) | 0x082e | 0x0409 | Latin1_General_CI_AS |
Luksemburski (Luksemburg) | 0x046e | 0x0409 | Latin1_General_CI_AS |
Macedoński (Macedonia Północna) | 0x042f | 0x042f | Macedonian_FYROM_90_CI_AS |
Malaj (Brunei Darussalam) | 0x083e | 0x0409 | Latin1_General_CI_AS |
Malajski (Malezja) | 0x043e | 0x0409 | Latin1_General_CI_AS |
Malajalam (Indie) | 0x044c | 0x0439 | Niedostępne na poziomie serwera |
Maltański (Malta) | 0x043a | 0x043a | Latin1_General_CI_AI |
Maori (Nowa Zelandia) | 0x0481 | 0x0481 | Latin1_General_CI_AI |
Mapudungun (Chile) | 0x047a | 0x047a | Latin1_General_CI_AI |
Marathi (Indie) | 0x044e | 0x0439 | Niedostępne na poziomie serwera |
Mohawk (Kanada) | 0x047c | 0x047c | Latin1_General_CI_AI |
mongolski (Mongolia) | 0x0450 | 0x0419 | Cyrillic_General_CI_AS |
Mongolski (ChRL) | 0x0850 | 0x0419 | Cyrillic_General_CI_AS |
Nepalski (Nepal) | 0x0461 | 0x0461 | Niedostępne na poziomie serwera |
Norweski (Bokmål, Norwegia) | 0x0414 | 0x0414 | Latin1_General_CI_AI |
Norweski (Nynorsk, Norwegia) | 0x0814 | 0x0414 | Latin1_General_CI_AI |
Occitan (Francja) | 0x0482 | 0x040c | French_CI_AS |
Odia (Indie) | 0x0448 | 0x0439 | Niedostępne na poziomie serwera |
Pashto (Afganistan) | 0x0463 | 0x0463 | Niedostępne na poziomie serwera |
Perski (Iran) | 0x0429 | 0x0429 | Latin1_General_CI_AI |
Język polski (Polska) | 0x0415 | 0x0415 | Polish_CI_AS |
Portugalski (Brazylia) | 0x0416 | 0x0409 | Latin1_General_CI_AS |
Portugalski (Portugalia) | 0x0816 | 0x0409 | Latin1_General_CI_AS |
Pendżabi (Indie) | 0x0446 | 0x0439 | Niedostępne na poziomie serwera |
Quechua (Boliwia) | 0x046b | 0x0409 | Latin1_General_CI_AS |
Quechua (Ekwador) | 0x086b | 0x0409 | Latin1_General_CI_AS |
Quechua (Peru) | 0x0c6b | 0x0409 | Latin1_General_CI_AS |
Rumuński (Rumunia) | 0x0418 | 0x0418 | Romanian_CI_AS |
Romansh (Szwajcaria) | 0x0417 | 0x0417 | Latin1_General_CI_AI |
Rosyjski (Rosja) | 0x0419 | 0x0419 | Cyrillic_General_CI_AS |
Sahka (Rosja) | 0x0485 | 0x0485 | Latin1_General_CI_AI |
Sami (Inari, Finlandia) | 0x243b | 0x083b | Latin1_General_CI_AI |
Sami (Lule, Norwegia) | 0x103b | 0x043b | Latin1_General_CI_AI |
Sami (Lule, Szwecja) | 0x143b | 0x083b | Latin1_General_CI_AI |
Sami (Północna, Finlandia) | 0x0c3b | 0x083b | Latin1_General_CI_AI |
Sami (Północna, Norwegia) | 0x043b | 0x043b | Latin1_General_CI_AI |
Sami (Północna, Szwecja) | 0x083b | 0x083b | Latin1_General_CI_AI |
Sami (Skolt, Finlandia) | 0x203b | 0x083b | Latin1_General_CI_AI |
Sami (Południowy, Norwegia) | 0x183b | 0x043b | Latin1_General_CI_AI |
Saamowie (południowa Szwecja) | 0x1c3b | 0x083b | Latin1_General_CI_AI |
Sanskrit (Indie) | 0x044f | 0x0439 | Niedostępne na poziomie serwera |
Serbski (Bośnia i Hercegowina, cyrylica) | 0x1c1a | 0x0c1a | Latin1_General_CI_AI |
Serbski (Bośnia i Hercegowina, Łaciński) | 0x181a | 0x081a | Latin1_General_CI_AI |
język serbski (Serbia, cyrylica) | 0x0c1a | 0x0c1a | Latin1_General_CI_AI |
Serbski (Serbia, Łaciński) | 0x081a | 0x081a | Latin1_General_CI_AI |
Sesotho sa Leboa/Northern Sotho (Republika Południowej Afryki) | 0x046c | 0x0409 | Latin1_General_CI_AS |
Setswana/Tswana (Republika Południowej Afryki) | 0x0432 | 0x0409 | Latin1_General_CI_AS |
Sinhala (Sri Lanka) | 0x045b | 0x0439 | Niedostępne na poziomie serwera |
Słowacki (Słowacja) | 0x041b | 0x041b | Slovak_CI_AS |
słoweński (Słowenia) | 0x0424 | 0x0424 | Slovenian_CI_AS |
Hiszpański (Argentyna) | 0x2c0a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Boliwia) | 0x400a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Chile) | 0x340a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Kolumbia) | 0x240a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Kostaryka) | 0x140a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Dominikana) | 0x1c0a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Ekwador) | 0x300a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Salwador) | 0x440a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Gwatemala) | 0x100a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Honduras) | 0x480a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Meksyk) | 0x080a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Nikaragua) | 0x4c0a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Panama) | 0x180a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Paragwaj) | 0x3c0a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Peru) | 0x280a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Portoryko) | 0x500a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Hiszpania) | 0x0c0a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Hiszpania, Tradycyjne sortowanie) | 0x040a | 0x040a | Traditional_Spanish_CI_AS |
Hiszpański (Stany Zjednoczone) | 0x540a | 0x0409 | Latin1_General_CI_AS |
Hiszpański (Urugwaj) | 0x380a | 0x0c0a | Modern_Spanish_CI_AS |
Hiszpański (Wenezuela) | 0x200a | 0x0c0a | Modern_Spanish_CI_AS |
Suahili (Kenia) | 0x0441 | 0x0409 | Latin1_General_CI_AS |
Szwedzki (Finlandia) | 0x081d | 0x040b | Finnish_Swedish_CI_AS |
Szwedzki (Szwecja) | 0x041d | 0x040b | Finnish_Swedish_CI_AS |
Syryjski (Syria) | 0x045a | 0x045a | Niedostępne na poziomie serwera |
Tadżycki (Tadżykistan) | 0x0428 | 0x0419 | Cyrillic_General_CI_AS |
Tamazight (Algieria, Łacińska) | 0x085f | 0x085f | Latin1_General_CI_AI |
Tamil (Indie) | 0x0449 | 0x0439 | Niedostępne na poziomie serwera |
Tatar (Rosja) | 0x0444 | 0x0444 | Cyrillic_General_CI_AS |
Telugu (Indie) | 0x044a | 0x0439 | Niedostępne na poziomie serwera |
Tajski (Tajlandia) | 0x041e | 0x041e | Thai_CI_AS |
Tybetańczyk (CHRL) | 0x0451 | 0x0451 | Niedostępne na poziomie serwera |
Turecki (Turcja) | 0x041f | 0x041f | Turkish_CI_AS |
Turkmen (Turkmenistan) | 0x0442 | 0x0442 | Latin1_General_CI_AI |
Ujgur (CHRL) | 0x0480 | 0x0480 | Latin1_General_CI_AI |
Ukraiński (Ukraina) | 0x0422 | 0x0422 | Ukrainian_CI_AS |
Górnołużycki (Niemcy) | 0x042e | 0x042e | Latin1_General_CI_AI |
Urdu (Pakistan) | 0x0420 | 0x0420 | Latin1_General_CI_AI |
Uzbek (Uzbekistan, Cyrylica) | 0x0843 | 0x0419 | Cyrillic_General_CI_AS |
Uzbek (Uzbekistan, alfabet łaciński) | 0x0443 | 0x0443 | Uzbek_Latin_90_CI_AS |
Wietnamski (Wietnam) | 0x042a | 0x042a | Vietnamese_CI_AS |
Walijski (Wielka Brytania) | 0x0452 | 0x0452 | Latin1_General_CI_AI |
Wolof (Senegal) | 0x0488 | 0x040c | French_CI_AS |
Xhosa/isiXhosa (Republika Południowej Afryki) | 0x0434 | 0x0409 | Latin1_General_CI_AS |
Yi (ChRL) | 0x0478 | 0x0409 | Latin1_General_CI_AS |
Yoruba (Nigeria) | 0x046a | 0x0409 | Latin1_General_CI_AS |
Zulu/isiZulu (Republika Południowej Afryki) | 0x0435 | 0x0409 | Latin1_General_CI_AS |
Po przypisaniu sortowania do serwera można go zmienić tylko przez wyeksportowanie wszystkich obiektów i danych bazy danych, ponowne skompilowanie master
bazy danych i zaimportowanie wszystkich obiektów i danych bazy danych. Zamiast zmieniać domyślne sortowanie wystąpienia programu SQL Server, można określić żądane sortowanie podczas tworzenia nowej bazy danych lub kolumny bazy danych.
Aby sprawdzić ustawienia sortowania serwera dla instancji programu SQL Server, skorzystaj z funkcji SERVERPROPERTY
:
SELECT CONVERT (NVARCHAR (128), SERVERPROPERTY('collation'));
Aby zapytać serwer o wszystkie dostępne sortowania, użyj następującej wbudowanej funkcji fn_helpcollations()
:
SELECT *
FROM sys.fn_helpcollations();
Sortowania w bazie danych Azure SQL
Nie można zmienić ani ustawić sortowania serwera logicznego w usłudze Azure SQL Database, ale można skonfigurować sortowania każdej bazy danych zarówno dla danych, jak i dla wykazu. Sortowanie wykazu określa sortowanie metadanych systemu, takich jak identyfikatory obiektów. Oba sortowania można określić niezależnie, gdy utworzyć bazę danych w witrynie Azure Portalw języku T-SQL za pomocą CREATE DATABASE, w programie PowerShell z new-AzSqlDatabase.
Sortowania w Azure SQL Managed Instance
Sortowanie na poziomie serwera w usłudze Azure SQL Managed Instance można określić podczas tworzenia wystąpienia i nie da się go później zmienić.
Aby uzyskać więcej informacji, zobacz Ustaw lub Zmień Sortowanie Serwera.
Sortowania na poziomie bazy danych
Podczas tworzenia lub modyfikowania bazy danych można użyć klauzuli COLLATE
instrukcji CREATE DATABASE
lub ALTER DATABASE
, aby określić domyślne sortowanie bazy danych. Jeśli sortowanie nie zostanie określone, baza danych zostanie przypisana do sortowania serwera.
Nie można zmienić sortowania systemowych baz danych, chyba że zmienisz sortowanie serwera.
- W programie SQL Server i usłudze Azure SQL Managed Instance sortowanie bazy danych jest używane dla wszystkich metadanych w bazie danych, a sortowanie jest ustawieniem domyślnym dla wszystkich kolumn ciągów, obiektów tymczasowych, nazw zmiennych i innych ciągów używanych w bazie danych.
- W usłudze Azure SQL Database nie ma sortowania serwera, dlatego każda baza danych ma sortowanie danych i sortowanie dla katalogu. CATALOG_COLLATION jest używany dla wszystkich metadanych w bazie danych, a sortowanie jest ustawieniem domyślnym dla wszystkich kolumn ciągów, obiektów tymczasowych, nazw zmiennych i innych ciągów używanych w bazie danych. CATALOG_COLLATION jest ustawiana podczas tworzenia i nie można jej zmienić.
Podczas zmiany sortowania bazy danych użytkownika mogą pojawić się konflikty sortowania, gdy zapytania w tej bazie danych uzyskują dostęp do tabel tymczasowych. Tabele tymczasowe są zawsze przechowywane w systemowej bazie danych tempdb
, która używa sortowania dla wystąpienia. Zapytania porównujące dane znaków między bazą danych użytkownika i tempdb
mogą zakończyć się niepowodzeniem, jeśli sortowania powodują konflikt podczas oceniania danych znaków. Ten problem można rozwiązać, określając klauzulę COLLATE
w zapytaniu. Aby uzyskać więcej informacji, zobacz COLLATE.
Sortowanie bazy danych użytkownika można zmienić przy użyciu instrukcji ALTER DATABASE
podobnej do następującego przykładu kodu:
ALTER DATABASE myDB COLLATE Greek_CS_AI;
Ważny
Zmiana sortowania na poziomie bazy danych nie ma wpływu na sortowanie na poziomie kolumny ani na poziomie wyrażenia. Nie ma to wpływu na dane w istniejących kolumnach.
Bieżące sortowanie bazy danych można pobrać przy użyciu instrukcji podobnej do następującego przykładu kodu:
SELECT CONVERT (NVARCHAR (128), DATABASEPROPERTYEX('database_name', 'collation'));
Sortowania na poziomie kolumn
Podczas tworzenia lub zmieniania tabeli można określić sortowania dla każdej kolumny ciągu znaków przy użyciu klauzuli COLLATE
. Jeśli nie określisz sortowania, kolumna zostanie przypisana do domyślnego sortowania bazy danych.
Sortowanie kolumny można zmienić przy użyciu instrukcji ALTER TABLE
podobnej do poniższego przykładu kodu:
ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR (10) COLLATE Greek_CS_AI;
Sortowania na poziomie wyrażeń
Sortowania na poziomie wyrażeń są ustawiane po uruchomieniu instrukcji i wpływają na sposób zwracania zestawu wyników. Umożliwia to ORDER BY
sortowanie wyników zgodnie z regionalnymi ustawieniami. Aby zaimplementować sortowania na poziomie wyrażeń, użyj klauzuli COLLATE
, takiej jak następujący przykład kodu:
SELECT name
FROM customer
ORDER BY name COLLATE Latin1_General_CS_AI;
Lokalizacja
Lokalizacja to zbiór informacji powiązanych z miejscem lub kulturą. Informacje mogą zawierać nazwę i identyfikator języka mówionego, skrypt używany do pisania języka i konwencji kulturowych. Sortowania mogą być skojarzone z jedną lub więcej lokalizacjami. Aby uzyskać więcej informacji, zapoznaj się z dokumentem Identyfikatory ustawień regionalnych przypisanych przez Microsoft.
Strona kodowa
Strona kodowa to uporządkowany zestaw znaków danego systemu pisma, w którym z każdym znakiem jest skojarzony indeks liczbowy lub wartość punktu kodowego. Strona kodowa systemu Windows jest zazwyczaj nazywana zestawem znaków lub zestawem znaków . Strony kodowe służą do zapewniania obsługi zestawów znaków i układów klawiatury, które są używane przez różne ustawienia regionalne systemu Windows.
Kolejność sortowania
Kolejność sortowania określa sposób sortowania wartości danych. Kolejność ma wpływ na wyniki porównania danych. Dane są sortowane przy użyciu sortowania i można je zoptymalizować przy użyciu indeksów.
Obsługa formatu Unicode
Unicode to standard mapowania punktów kodu na znaki. Ponieważ jest ona przeznaczona do obsługi wszystkich znaków we wszystkich językach świata, nie potrzebujesz różnych stron kodu do obsługi różnych zestawów znaków.
Podstawy Unicode
Przechowywanie danych w wielu językach w jednej bazie danych jest trudne do zarządzania, gdy używasz tylko danych znaków i stron kodu. Trudno jest również znaleźć jedną stronę kodową bazy danych, która może przechowywać wszystkie wymagane znaki specyficzne dla języka. Ponadto trudno jest zagwarantować poprawne tłumaczenie znaków specjalnych podczas ich odczytywania lub aktualizowania przez różnych klientów, którzy uruchamiają różne strony kodu. Bazy danych obsługujące klientów międzynarodowych powinny zawsze używać typów danych Unicode zamiast typów danych innych niż Unicode.
Rozważmy na przykład bazę danych klientów w Ameryce Północnej, która musi obsługiwać trzy główne języki:
- Hiszpańskie nazwy i adresy meksyku
- Francuskie nazwy i adresy dla Quebecu
- Nazwy i adresy angielskie dla reszty Kanady i Stanów Zjednoczonych
W przypadku używania tylko kolumn znaków i stron kodu należy zadbać o to, aby baza danych została zainstalowana ze stroną kodową, która będzie obsługiwać znaki wszystkich trzech języków. Należy również zadbać o zagwarantowanie poprawnego tłumaczenia znaków z dowolnego z języków, gdy znaki są odczytywane przez klientów, którzy uruchamiają stronę kodową dla innego języka.
Notatka
Strony kodu używane przez klienta są określane przez ustawienia systemu operacyjnego. Aby ustawić strony kodu klienta w systemie operacyjnym Windows, użyj Ustawień Regionalnych w Panelu sterowania.
Trudno byłoby wybrać stronę kodową dla typów danych znaków, które będą obsługiwać wszystkie znaki wymagane przez odbiorców na całym świecie. Najprostszym sposobem zarządzania danymi znakowymi w międzynarodowych bazach danych jest zawsze użycie typu danych obsługującego kod Unicode.
Typy danych Unicode
Jeśli przechowujesz dane znaków odzwierciedlające wiele języków w programie SQL Server (SQL Server 2005 (9.x) i nowszych), użyj typów danych Unicode (
Notatka
Dla typów danych Unicode, Silnik bazy danych może reprezentować do 65 536 znaków używając UCS-2 lub pełny zakres Unicode (1 114 112 znaków), jeśli używane są znaki dodatkowe. Aby uzyskać więcej informacji na temat włączania znaków dodatkowych, zobacz Znaki dodatkowe.
Alternatywnie, począwszy od programu SQL Server 2019 (15.x), jeśli jest używane sortowanie z włączoną funkcją UTF-8 (_UTF8), wcześniej typy danych innych niż Unicode ( znaków i varchar) stają się typami danych Unicode przy użyciu kodowania UTF-8. Program SQL Server 2019 (15.x) nie zmienia zachowania poprzednio istniejących typów danych Unicode (nchar, nvarchari ntext), które nadal używają kodowania UCS-2 lub UTF-16. Aby uzyskać więcej informacji, zobacz Różnice w przechowywaniu pomiędzy UTF-8 a UTF-16.
Zagadnienia dotyczące unicode
Istotne ograniczenia są skojarzone z typami danych innych niż Unicode. Dzieje się tak, ponieważ komputer inny niż Unicode jest ograniczony do korzystania z jednej strony kodowej. Możesz zauważyć poprawę wydajności dzięki użyciu Unicode, ponieważ wymaga on mniej konwersji stron kodowych. Sortowania Unicode muszą być wybierane indywidualnie na poziomie bazy danych, kolumny lub wyrażenia, ponieważ nie są obsługiwane na poziomie serwera.
Podczas przenoszenia danych z serwera do klienta sortowanie serwera może nie być rozpoznawane przez starsze sterowniki klienta. Taka sytuacja może wystąpić w przypadku przenoszenia danych z serwera Unicode do klienta innego niż Unicode. Najlepszą opcją może być uaktualnienie systemu operacyjnego klienta tak, aby podstawowe sortowania systemu były aktualizowane. Jeśli klient ma zainstalowane oprogramowanie klienckie bazy danych, możesz rozważyć zastosowanie aktualizacji usługi do oprogramowania klienckiego bazy danych.
Napiwek
Możesz również użyć innego sortowania danych na serwerze. Wybierz sortowanie, które odpowiada stronie kodowej na kliencie. Aby użyć kolacji UTF-16, które są dostępne w programie SQL Server (SQL Server 2012 (11.x) i późniejszych), aby ulepszyć wyszukiwanie i sortowanie niektórych znaków Unicode (tylko kolacje systemu Windows), można wybrać jedną z kolacji znaków uzupełniających (_SC) lub jedną z kolacji w wersji 140.
Aby użyć sortowania UTF-8, które są dostępne w programie SQL Server 2019 (15.x) i aby ulepszyć wyszukiwanie i sortowanie niektórych znaków Unicode (tylko sortowania systemu Windows), należy wybrać sortowania z obsługą kodowania UTF-8 (_UTF8).
Flagę UTF8 można zastosować do:
- Sortowania językowe, które obsługują już znaki dodatkowe (_SC) lub rozpoznawanie selektora odmiany (_VSS)
- Sortowanie binarne BIN2
Nie można zastosować flagi UTF8 do:
- Sortowania językowe, które nie obsługują znaków dodatkowych (_SC) ani rozpoznawania selektorów odmian (_VSS)
- Sortowania binarne typu "BIN"
- Sortowania SQL_*
Aby ocenić problemy związane z używaniem typów danych Unicode lub innych niż Unicode, przetestuj swój scenariusz, aby zmierzyć różnice wydajności w środowisku. Dobrym rozwiązaniem jest standaryzacja sortowania używanego w systemach w organizacji oraz wdrażania serwerów i klientów Unicode wszędzie tam, gdzie to możliwe.
W wielu sytuacjach program SQL Server współdziała z innymi serwerami lub klientami, a Organizacja może używać wielu standardów dostępu do danych między aplikacjami i wystąpieniami serwera. Klienci programu SQL Server są jednym z dwóch głównych typów:
- klientów Unicode korzystających z OLE DB i Open Database Connectivity (ODBC) w wersji 3.7 lub nowszej.
- klientów nieobsługujących Unicode korzystających z DB-Library i ODBC w wersji 3.6 lub starszej.
Poniższa tabela zawiera informacje o korzystaniu z danych wielojęzycznych z różnymi kombinacjami serwerów Unicode i innych niż Unicode:
Serwer | Klient | Korzyści lub ograniczenia |
---|---|---|
Unicode | Unicode | Ponieważ dane Unicode są używane w całym systemie, ten scenariusz zapewnia najlepszą wydajność i ochronę przed uszkodzeniem pobranych danych. Jest to sytuacja w przypadku obiektów danych ActiveX (ADO), OLE DB i ODBC w wersji 3.7 lub nowszej. |
Unicode | Inne niż Unicode | W tym scenariuszu, szczególnie w przypadku połączeń między serwerem z nowszym systemem operacyjnym i klientem z wcześniejszą wersją programu SQL Server lub starszym systemem operacyjnym mogą występować ograniczenia lub błędy podczas przenoszenia danych na komputer kliencki. Dane Unicode na serwerze dążą do dopasowania do odpowiedniej strony kodowej na kliencie nie obsługującym Unicode w celu konwersji danych. |
Inne niż Unicode | Unicode | Nie jest to idealna konfiguracja do korzystania z danych wielojęzycznych. Nie można zapisać danych Unicode na serwerze innym niż Unicode. Problemy mogą wystąpić, gdy dane są wysyłane do serwerów spoza strony kodowej serwera. |
Inne niż Unicode | Inne niż Unicode | Jest to bardzo ograniczający scenariusz dla danych wielojęzycznych. Można użyć tylko jednej strony kodu. |
Znaki dodatkowe
Konsorcjum Unicode przydziela każdemu znakowi unikatowy punkt kodu, który jest wartością z zakresu 0000000–10FFFF. Najczęściej używane znaki mają wartości punktów kodu w zakresie 000000– 00FFFF (65 536 znaków), które mieszczą się w 8-bitowym lub 16-bitowym słowie w pamięci i na dysku. Ten zakres jest zwykle wyznaczony jako podstawowa płaszczyzna wielojęzyczna (BMP).
Jednak Konsorcjum Unicode ustanowiło 16 dodatkowych "płaszczyzn" znaków, każdy o takim samym rozmiarze jak BMP. Ta definicja umożliwia unicode możliwość reprezentowania 1114 112 znaków (czyli 216 * 17 znaków) w zakresie punktów kodu 000000– 10FFFF. Znaki z wartością punktu kodu większą niż 00FFFF wymagają od dwóch do czterech kolejnych 8-bitowych wyrazów (UTF-8) lub dwóch kolejnych 16-bitowych wyrazów (UTF-16). Te znaki znajdujące się poza BMP są nazywane dodatkowych znaków, a dodatkowe kolejne 8-bitowe lub 16-bitowe wyrazy są nazywane par zastępczych. Aby uzyskać więcej informacji na temat dodatkowych znaków, zastępców i par zastępczych, zobacz standardowego standardu Unicode.
Program SQL Server udostępnia typy danych, takie jak nchar i nvarchar do przechowywania danych Unicode w zakresie BMP (000000– 00FFFF), które aparat bazy danych koduje przy użyciu UCS-2.
SQL Server 2012 (11.x) wprowadził nową rodzinę sortowań znaków dodatkowych (_SC), które można stosować z typami danych nchar, nvarchari sql_variant, aby reprezentować pełny zakres znaków Unicode (000000 – 10FFFF). Na przykład: Latin1_General_100_CI_AS_SC
lub, jeśli używasz sortowania japońskiego, Japanese_Bushu_Kakusu_100_CI_AS_SC
.
Program SQL Server 2019 (15.x) rozszerza obsługę dodatkowych znaków na
Notatka
Począwszy od programu SQL Server 2017 (14.x), wszystkie nowe sortowania automatycznie obsługują znaki dodatkowe.
Jeśli używasz dodatkowych znaków:
Znaki dodatkowe mogą być używane w operacjach porządkowania i porównywania w wersjach sortowania 90 lub nowszych.
Wszystkie sortowania w wersji 100 obsługują sortowanie językowe z dodatkowymi znakami.
Znaki dodatkowe nie są obsługiwane do użycia w metadanych, takich jak nazwy obiektów bazy danych.
Flagę SC można zastosować do:
- Porównania wersji 90
- Kolacje wersji 100
Nie można zastosować flagi SC do:
- Sortowania systemu Windows w wersji 80 bez oznaczenia wersji
- Sortowania binarne BIN lub BIN2
- Kolejności SQL*
- Sortowania w wersji 140 (nie potrzebują flagi SC, ponieważ już obsługują znaki uzupełniające)
W poniższej tabeli porównuje się zachowanie niektórych funkcji ciągów i operatorów ciągów podczas używania dodatkowych znaków z sortowaniem uwzględniającym znaki dodatkowe oraz bez niego (SCA).
Funkcja lub operator ciągu | Porządkowanie według SCA | Bez sortowania SCA |
---|---|---|
CHARINDEX LEN |
Para zastępcza UTF-16 jest liowana jako pojedynczy punkt kodu. | Para zastępcza UTF-16 jest liczona jako dwa punkty kodowe. |
LEWA ZASTĄP ODWROTNOŚĆ RIGHT podciąg STUFF |
Te funkcje traktują każdą parę zastępczą jako pojedynczy punkt kodu i działają zgodnie z oczekiwaniami. | Te funkcje mogą dzielić dowolne pary surogatowe i prowadzić do nieoczekiwanych wyników. |
NCHAR | Zwraca znak odpowiadający określonej wartości punktu kodu Unicode w zakresie 0 — 0x10FFFF. Jeśli określona wartość znajduje się w zakresie 0 — 0xFFFF, zwracany jest jeden znak. W przypadku wyższych wartości zwracany jest odpowiedni zamiennik. | Wartość wyższa niż 0xFFFF zwraca NULL zamiast odpowiedniego surogatu. |
UNICODE | Zwraca punkt kodu UTF-16 w zakresie 0 — 0x10FFFF. | Zwraca punkt kodu UCS-2 w zakresie 0 — 0xFFFF. |
dopasuj jeden znak wieloznaczny Symbol wieloznaczny - znak(i), które nie pasują do |
Dodatkowe znaki są obsługiwane dla wszystkich operacji z symbolami wieloznacznymi. | Dodatkowe znaki nie są obsługiwane w przypadku tych operacji z symbolami wieloznacznymi. Obsługiwane są inne operatory wieloznaczne. |
Obsługa GB18030
GB18030 jest oddzielnym standardem używanym w Chińskiej Republice Ludowej do kodowania chińskich znaków. W GB18030 znaki mogą mieć długość 1, 2 lub 4 bajty. Program SQL Server zapewnia obsługę znaków zakodowanych w GB18030, rozpoznając je, gdy są przesyłane z aplikacji po stronie klienta do serwera, a następnie konwertując i przechowując je natywnie jako znaki Unicode. Po ich zapisaniu na serwerze są traktowane jako znaki Unicode w kolejnych operacjach.
Możesz użyć dowolnej chińskiej kolejności, najlepiej wersji 100 najnowszej. Wszystkie sortowania w wersji 100 obsługują sortowanie językowe z znakami GB18030. Jeśli dane zawierają dodatkowe znaki (pary zastępcze), możesz użyć sortowania SC, które są dostępne w programie SQL Server, aby ulepszyć wyszukiwanie i sortowanie.
Notatka
Upewnij się, że narzędzia klienckie, takie jak SQL Server Management Studio, używają czcionki Dengxian do poprawnego wyświetlania ciągów zawierających znaki zakodowane GB18030.
Obsługa złożonych skryptów
Program SQL Server może obsługiwać wprowadzanie, przechowywanie, zmienianie i wyświetlanie złożonych skryptów. Złożone skrypty obejmują następujące typy:
- Skrypty, które zawierają kombinację tekstu od prawej do lewej i od lewej do prawej, takich jak kombinacja tekstu arabskiego i angielskiego.
- Skrypty, których znaki zmieniają kształt w zależności od ich położenia lub w połączeniu z innymi znakami, takimi jak arabski, indyjski i tajski.
- Języki, takie jak Tajski, które wymagają wewnętrznych słowników rozpoznawania wyrazów, ponieważ nie ma żadnych przerw między nimi.
Aplikacje bazy danych, które współdziałają z programem SQL Server, muszą używać kontrolek obsługujących złożone skrypty. Standardowe kontrolki formularzy Windows utworzone w kodzie zarządzanym obsługują złożone skrypty.
Sortowania japońskie dodane w programie SQL Server 2017
Począwszy od programu SQL Server 2017 (14.x), obsługiwane są nowe japońskie rodziny sortowania z permutacjami różnych opcji (_CS
, _AS
, _KS
, _WS
i _VSS
), a także _BIN
i _BIN2
.
Aby wyświetlić listę tych sortowań, możesz wykonać zapytanie dotyczące silnika bazy danych SQL Server.
SELECT name,
description
FROM sys.fn_helpcollations()
WHERE COLLATIONPROPERTY(name, 'Version') = 3;
Żadne z nowych ustawień sortowania 140
nie ma (nie wymaga) flagi SC, ponieważ wszystkie nowe ustawienia sortowania mają wbudowaną obsługę dodatkowych znaków.
Te sortowania są obsługiwane w indeksach aparatu bazy danych, tabelach zoptymalizowanych pod kątem pamięci, indeksach magazynu kolumn i natywnie skompilowanych modułach.
Obsługa protokołu UTF-8
Program SQL Server 2019 (15.x) wprowadza pełną obsługę powszechnie używanego kodowania znaków UTF-8 jako kodowania importu lub eksportu oraz sortowania na poziomie bazy danych lub na poziomie kolumny dla danych ciągów. Protokół UTF-8 jest dozwolony w Latin1_General_100_CI_AS_SC
na Latin1_General_100_CI_AS_SC_UTF8
.
UTF-8 jest dostępny tylko dla sortowań systemu Windows, które obsługują dodatkowe znaki, wprowadzonych w programie SQL Server 2012 (11.x). Typy danych nchar i nvarchar zezwalają tylko na kodowanie UCS-2 lub UTF-16 i pozostają niezmienione.
Usługi Azure SQL Database i Azure SQL Managed Instance obsługują również protokół UTF-8 na poziomie bazy danych i kolumn, natomiast usługa SQL Managed Instance obsługuje tę funkcję również na poziomie serwera.
Różnice w przechowywaniu danych między UTF-8 a UTF-16
Konsorcjum Unicode przydziela każdemu znakowi unikatowy punkt kodu, który jest wartością z zakresu 0000000–10FFFF. W programie SQL Server 2019 (15.x) dostępne są zarówno kodowania UTF-8, jak i UTF-16, aby reprezentować pełny zakres:
- W przypadku kodowania UTF-8 znaki w zakresie ASCII (000000– 00007F) wymagają 1 bajtu, punkty kodu 0000080 – 0007FF wymagają 2 bajtów, punkty kodu 000800 – 00FFFF wymagają 3 bajtów, a punkty kodu 0010000 – 00100FFFF wymagają 4 bajtów.
- W przypadku kodowania UTF-16 punkty kodu 000000–00FFFF wymagają 2 bajtów, a punkty kodu 0010000 – 0010FFFF wymagają 4 bajtów.
W poniższej tabeli wymieniono bajty przechowywania kodowania dla każdego przedziału znaków i typu kodowania.
Zakres kodu (szesnastkowy) | Zakres kodu (dziesiętny) | Bajty pamięci 1 z kodowaniem UTF-8 | Bajty pamięci 1 z UTF-16 |
---|---|---|---|
000000– 00007F | 0 - 127 | 1 | 2 |
000080 – 00009F 0000A0 – 0003FF 000400 – 0007FF |
128 - 159 160 - 1,023 1,024 - 2,047 |
2 | 2 |
000800 – 003FFF 004000 – 00FFFF |
2,048 - 16,383 16,384 - 65,535 |
3 | 2 |
010000 – 03FFFF 2 040000 – 10FFFF 2 |
65 536 - 262 143 2 262,144 - 1,114,111 2 |
4 | 4 |
1Bajty pamięci odnoszą się do długości zakodowanych bajtów, a nie rozmiaru pamięci na dysku. Aby uzyskać więcej informacji na temat rozmiarów przechowywania na dysku, zobacz nchar i nvarchar oraz char i varchar.
2 zakres punktów kodu dla znaków dodatkowych .
Napiwek
Powszechnie uważa się, że w char i varchar lub w nchar i nvarchar, wartość n określa liczbę znaków. Dzieje się tak, ponieważ w przykładzie kolumny char(10) 10 znaków ASCII w zakresie od 0 do 127 można przechowywać przy użyciu sortowania, takiego jak Latin1_General_100_CI_AI
, ponieważ każdy znak w tym zakresie używa tylko 1 bajtów. Jednak w char i varcharn definiuje rozmiar ciągu w bajtach (0 – 8000) i w nchar i nvarchar, n definiuje rozmiar ciągu w parach bajtowych (0 – 4000).
n nigdy nie definiuje liczby znaków, które mogą być przechowywane.
Wybranie odpowiedniego kodowania Unicode i typu danych może spowodować znaczne oszczędności magazynu lub zwiększyć bieżące zużycie miejsca do magazynowania, w zależności od używanego zestawu znaków. Na przykład w przypadku używania sortowania łacińskiego z włączonym formatem UTF-8, takiego jak Latin1_General_100_CI_AI_SC_UTF8
, kolumna znak 10 przechowuje 10 bajtów i może pomieścić 10 znaków ASCII w zakresie od 0 do 127. Ale może zawierać tylko pięć znaków w zakresie 128 - 2047 i tylko trzy znaki w zakresie 2048 - 65535. Dla porównania, ponieważ kolumna nchar(10) przechowuje 10 par bajtów (20 bajtów), może przechowywać 10 znaków w zakresie od 0 do 65535.
Przed podjęciem decyzji, czy używać kodowania UTF-8 lub UTF-16 dla bazy danych lub kolumny, rozważ dystrybucję danych ciągów, które będą przechowywane:
- Jeśli jest to głównie w zakresie ASCII 0 - 127 (na przykład angielski), każdy znak wymaga 1 bajtu w UTF-8 i 2 bajtów w UTF-16. Korzystanie z protokołu UTF-8 zapewnia korzyści z magazynowania. Zmiana istniejącego typu danych kolumny zawierającej znaki ASCII w zakresie od 0 do 127 z nchar(10) na char(10)oraz użycie sortowania z włączonym UTF-8 przekłada się na 50-procentową redukcję wymagań dotyczących miejsca na dysku. Jest to spowodowane tym, że nchar(10) wymaga 20 bajtów do przechowywania, w porównaniu z char(10), który wymaga 10 bajtów dla tej samej reprezentacji ciągu Unicode.
- Powyżej zakresu ASCII, prawie wszystkie skrypty oparte na łacinie oraz grecki, cyrylica, koptyjski, ormiański, hebrajski, arabski, syryjski, Tana i N'Ko, wymagają 2 bajtów na każdy znak zarówno w UTF-8, jak i UTF-16. W takich przypadkach nie ma znaczących różnic w przechowywaniu (na przykład między użyciem char lub nchar) dla porównywalnych typów danych.
- Jeśli jest to głównie pismo wschodnioazjatyckie (takie jak koreańskie, chińskie i japońskie), każdy znak wymaga 3 bajtów w UTF-8 i 2 bajtów w UTF-16. Korzystanie z protokołu UTF-16 zapewnia korzyści z magazynowania.
- Znaki z zakresu 010000– 10FFFF wymagają 4 bajtów zarówno w formacie UTF-8, jak i UTF-16. W takich przypadkach nie ma różnic w przechowywaniu dla porównywalnych typów danych (na przykład między używaniem char lub nchar).
Aby zapoznać się z innymi zagadnieniami, zobacz Write International Transact-SQL Statements.
Konwertowanie na utF-8
Ponieważ w char i varchar lub w nchar i nvarchar, n definiuje rozmiar magazynu bajtów, a nie liczbę znaków, które można przechowywać, ważne jest określenie rozmiaru typu danych, na który należy przekonwertować. Znaki przekraczające rozmiar mają zostać obcięte.
Rozważmy na przykład kolumnę zdefiniowaną jako nvarchar(100), która przechowuje 180 bajtów znaków japońskich. W tym przykładzie dane kolumny są obecnie kodowane przy użyciu protokołu UCS-2 lub UTF-16, który używa 2 bajtów na znak. Konwertowanie typu kolumny na varchar(200) nie jest wystarczające, aby zapobiec obcinaniu danych, ponieważ nowy typ danych może przechowywać tylko 200 bajtów, ale znaki japońskie wymagają 3 bajtów podczas kodowania w formacie UTF-8. Kolumna musi być zdefiniowana jako varchar(270), aby uniknąć utraty danych przez obcinanie danych.
Dlatego przed przekonwertowaniem istniejących danych na wartość UTF-8 należy wcześniej wiedzieć, jaki jest przewidywany rozmiar bajtów dla definicji kolumny, i odpowiednio dostosować rozmiar nowego typu danych. Zapoznaj się ze skryptem Transact-SQL lub notesem SQL w Data Samples GitHub, który używa funkcji DATALENGTH oraz instrukcji COLLATE, aby określić odpowiednie wymagania dotyczące długości danych dla operacji konwersji UTF-8 w istniejącej bazie danych.
Aby zmienić sortowanie kolumn i typ danych w istniejącej tabeli, użyj jednej z metod opisanych w Ustaw lub Zmień sortowanie kolumn.
Aby zmienić sortowanie bazy danych, zezwalając nowym obiektom na dziedziczenie sortowania bazy danych domyślnie lub zmienić sortowanie serwera, dzięki czemu nowe bazy danych domyślnie dziedziczą sortowanie systemu, zobacz sekcję Powiązane zadania tego artykułu.
Powiązane zadania
Zadanie | Artykuł |
---|---|
Opisuje sposób ustawiania lub zmieniania sortowania wystąpienia programu SQL Server. Zmiana sortowania serwera nie zmienia sortowania istniejących baz danych. | ustaw lub zmień sortowanie serwera |
Opisuje sposób ustawiania lub zmieniania sortowania bazy danych użytkownika. Zmiana sortowania bazy danych nie zmienia sortowania istniejących kolumn tabeli. | Ustaw lub zmień porządek sortowania bazy danych |
Opisuje sposób ustawiania lub zmieniania sortowania kolumny w bazie danych. | Ustawianie lub zmienianie porządku kolumn |
Opisuje sposób zwracania informacji sortowania na poziomie serwera, bazy danych lub kolumny. | Wyświetl informacje o sortowaniu |
Opisuje, jak pisać instrukcje Transact-SQL, które są łatwiej przenośne między różnymi językami lub łatwiejsze w obsłudze wielu języków. | Tworzenie międzynarodowych oświadczeń Transact-SQL |
Opisuje sposób zmieniania języka komunikatów o błędach i preferencji dotyczących sposobu użycia i wyświetlania danych daty, godziny i waluty. | Ustaw język sesji |
Powiązana zawartość
- Najlepsze Praktyki dla Zmiany Sortowania w SQL Server
- używanie formatu znaków Unicode do importowania lub eksportowania danych (SQL Server)
- Tworzenie międzynarodowych oświadczeń Transact-SQL
- Migracja najlepszych rozwiązań programu SQL Server do Unicode
-
Unicode Consortium - Standard Unicode
- obsługa protokołu UTF-8 w sterowniku OLE DB dla programu SQL Server
- nazwa sortowania programu SQL Server (Transact-SQL)
- nazwa sortowania systemu Windows (Transact-SQL)
- wprowadzenie obsługi protokołu UTF-8 dla programu SQL Server
- COLLATE (Transact-SQL)
- Pierwszeństwo kolidacji
- Collations zawarte w bazach danych
- Wybierz język podczas tworzenia Full-Text indeksu
- sys.fn_helpcollations (Transact-SQL)
- Single-Byte i zestawy znaków wielobajtowych