Przechodzimy z SQL 2005 [Instancja i DB mają sortowanie SQL_Latin1_General_CP1_CI_AS
] do SQL 2008 [domyślnie to Latin1_General_CI_AS
].
Ukończyłem instalację SQL 2008 R2 i użyłem domyślnego Latin1_General_CI_AS
sortowania z przywracaniem bazy danych SQL_Latin1_General_CP1_CI_AS
. Wystąpiły wyjątki - tabele #temp, w których Latin1_General_CI_AS
znajdował się czas db SQL_Latin1_General_CP1_CI_AS
i to jest miejsce, w którym teraz jestem - potrzebuję teraz porady na temat pułapek.
Na instalacji SQL 2008 R2, mam opcję instalacji do użytku 'SQL Collation, used for backwards compatibility'
, gdzie mam możliwość wyboru tego samego sortowania jako bazy danych 2005: SQL_Latin1_General_CP1_CI_AS
.
Pozwoli mi to nie mieć problemów ze stołami #temp, ale czy są jakieś pułapki?
Czy straciłbym jakąkolwiek funkcjonalność lub funkcje, nie używając „aktualnego” zestawienia SQL 2008?
- A co, kiedy przeprowadzimy się (np. Za 2 lata) z 2008 do SQL 2012? Czy wtedy będę miał problemy?
Czy w którymś momencie byłbym zmuszony pójść do
Latin1_General_CI_AS
?Przeczytałem, że niektóre skrypty DBA uzupełniają rzędy kompletnych baz danych, a następnie uruchom skrypt wstawiania do bazy danych z nowym zestawieniem - jestem bardzo przestraszony i nieufny - czy poleciłbyś to zrobić?
źródło
Odpowiedzi:
Przede wszystkim przepraszam za tak długą odpowiedź, ponieważ uważam, że nadal istnieje wiele zamieszania, gdy ludzie mówią o terminach takich jak sortowanie, porządek sortowania, strona kodowa itp.
Z BOL :
Oznacza to, że sortowanie jest bardzo ważne, ponieważ określa zasady sortowania i porównywania ciągów znaków danych.
Uwaga: Więcej informacji na temat COLLATIONPROPERTY
Teraz Najpierw zrozummy różnice ......
Uruchamianie poniżej T-SQL:
Wyniki byłyby następujące:
Patrząc na powyższe wyniki, jedyną różnicą jest kolejność sortowania między 2 zestawieniami, ale to nieprawda, co możesz zobaczyć, jak poniżej:
Test 1:
Wyniki testu 1:
Z powyższych wyników widzimy, że nie możemy bezpośrednio porównywać wartości w kolumnach z różnymi zestawieniami, musisz użyć
COLLATE
do porównania wartości kolumn.TEST 2:
Główną różnicą jest wydajność, jak wskazuje Erland Sommarskog w tej dyskusji na msdn .
--- Utwórz indeksy na obu tabelach
--- Uruchom zapytania
--- Będzie to miało konwersję IMPLICIT
--- Uruchom zapytania
--- NIE będzie to miało IMPLICIT Conversion
Powodem niejawnej konwersji jest to, że mam sortowanie bazy danych i serwera zarówno jako, jak
SQL_Latin1_General_CP1_CI_AS
i tabela Table_Latin1_General_CI_AS ma kolumnę Komentarze zdefiniowane jak wVARCHAR(50)
przypadku COLLATE Latin1_General_CI_AS , więc podczas wyszukiwania SQL Server musi wykonać konwersję IMPLICIT.Test 3:
Przy takim samym ustawieniu porównamy teraz kolumny varchar z wartościami nvarchar, aby zobaczyć zmiany w planach wykonania.
- uruchom zapytanie
- uruchom zapytanie
Zauważ, że pierwsze zapytanie jest w stanie wykonać wyszukiwanie indeksu, ale musi wykonać niejawną konwersję, podczas gdy drugie wykonuje skanowanie indeksu, które okazuje się nieefektywne pod względem wydajności podczas skanowania dużych tabel.
Wniosek:
SQL_Latin1_General_CP1_CI_AS
to zestawienie SQL z regułami, które pozwalają na sortowanie danych dla kodu Unicode i innego niż Unicode.Latin1_General_CI_AS
to zestawienie systemu Windows z regułami, które pozwalają ci sortować dane dla Unicode i nie Unicode są takie same.Zobacz moją odpowiedź powyżej.
Wszystko zależy od tego, do jakiej funkcjonalności / funkcji się odnosisz. Sortowanie to przechowywanie i sortowanie danych.
Nie mogę ręczyć! Ponieważ wszystko może się zmienić i zawsze dobrze jest być zgodnym z sugestią Microsoftu +, musisz zrozumieć swoje dane i pułapki, o których wspomniałem powyżej. Zapoznaj się także z tym i tymi elementami łączenia.
Jeśli chcesz zmienić sortowanie, przydatne są takie skrypty. Przekonałem się, że wiele razy zmieniam układanie baz danych, aby dopasować układanie na serwerze i mam kilka skryptów, które robią to całkiem nieźle. Daj mi znać, jeśli będziesz tego potrzebować.
Bibliografia :
źródło
Oprócz tego, co @Kin szczegółowo opisał w swojej odpowiedzi , należy pamiętać o kilku innych rzeczach przy przełączaniu domyślnego sortowania serwera (tj. Instancji) (elementy powyżej linii poziomej są bezpośrednio związane z dwoma zestawieniami wymienionymi w pytaniu; elementy poniżej linii poziomej odnoszą się do ogólnych):
JEŚLI DOMYŚLNA KOLACJA BAZY DANYCH NIE JEST ZMIENIONA, to problem wydajności „niejawnej konwersji” opisany w odpowiedzi @ Kin nie powinien stanowić problemu, ponieważ literały łańcuchowe i zmienne lokalne używają domyślnego sortowania bazy danych, a nie serwera. Jedyny wpływ na scenariusz, w którym zmienia się sortowanie na poziomie instancji, ale nie sortowanie na poziomie bazy danych (oba opisano szczegółowo poniżej):
Jedną różnicą między tymi dwoma zestawieniami jest sposób sortowania określonych znaków dla
VARCHAR
danych (nie wpływa to naNVARCHAR
dane). Zestawienia niebędące EBCDICSQL_
używają doVARCHAR
danych tak zwanego „sortowania ciągów” , podczas gdy wszystkie inne zestawienia, a nawetNVARCHAR
dane dla zestawień niebędących EBCDICSQL_
, używają tak zwanego „sortowania słów”. Różnica polega na tym, że w „Sortowaniu słów” myślnik-
i apostrof'
(a może kilka innych znaków?) Mają bardzo małą wagę i są zasadniczo ignorowane, chyba że występują inne różnice w łańcuchach. Aby zobaczyć to zachowanie w działaniu, uruchom następujące polecenie:Zwroty:
i:
Chociaż „stracisz” zachowanie „Sortowanie ciągów”, nie jestem pewien, czy nazwałbym to „funkcją”. Jest to zachowanie uznane za niepożądane (o czym świadczy fakt, że nie zostało przeniesione do żadnej z zestawów Windows). Jest to jednak wyraźna różnica w zachowaniu między dwoma zestawieniami (ponownie, tylko w przypadku
VARCHAR
danych niebędących danymi EBCDIC ), i możesz mieć kod i / lub oczekiwania klienta oparte na zachowaniu „Sortowanie ciągów”. Wymaga to przetestowania kodu i ewentualnie zbadania, czy zmiana zachowania może mieć negatywny wpływ na użytkowników.Kolejną różnicą pomiędzy
SQL_Latin1_General_CP1_CI_AS
iLatin1_General_100_CI_AS
jest możliwość zrobienia Rozszerzenia naVARCHAR
danych (NVARCHAR
dane te mogą już zrobić dla większościSQL_
Konfrontacje), takie jak obsługaæ
, jakby to byłoae
:Zwroty:
Jedyną rzeczą, którą są „utratą” jest tu nie jest w stanie wykonać tych rozszerzeń. Ogólnie rzecz biorąc, jest to kolejna zaleta przejścia na sortowanie systemu Windows. Jednak, podobnie jak w przypadku przenoszenia „Sortowanie według ciągów” do „Sortowania według słów”, obowiązuje ta sama uwaga: jest to wyraźna różnica w zachowaniu między dwoma zestawieniami (ponownie, tylko dla
VARCHAR
danych), i możesz mieć kod i / lub klienta oczekiwania oparte na braku tych mapowań. Wymaga to przetestowania kodu i ewentualnie zbadania, czy zmiana zachowania może mieć negatywny wpływ na użytkowników.(po raz pierwszy odnotowany w tej SO odpowiedzi przez @Zarepheth: Czy SQL Server SQL_Latin1_General_CP1_CI_AS można bezpiecznie przekonwertować na Latin1_General_CI_AS? )
Sortowanie na poziomie serwera służy do ustawiania sortowania systemowych baz danych, które obejmuje
[model]
. Baza[model]
danych jest używana jako szablon do tworzenia nowych baz danych, które obejmują[tempdb]
przy każdym uruchomieniu serwera. Ale nawet przy zmianie sortowania na poziomie serwera zmieniającej sortowanie[tempdb]
, istnieje dość prosty sposób na poprawienie różnic sortowania między bazą danych, która jest „aktualna”, kiedyCREATE #TempTable
jest wykonywana, i[tempdb]
. Tworząc tabele tymczasowe, zadeklaruj sortowanie za pomocąCOLLATE
klauzuli i określ sortowanieDATABASE_DEFAULT
:Najlepiej jest użyć najnowszej wersji żądanego sortowania, jeśli dostępnych jest wiele wersji. Począwszy od SQL Server 2005, wprowadzono serię „90” zestawień, a SQL Server 2008 wprowadził serię „100” zestawień. Możesz znaleźć te zestawienia, korzystając z następujących zapytań:
Ponieważ korzystasz z SQL Server 2008 R2, powinieneś użyć
Latin1_General_100_CI_AS
zamiastLatin1_General_CI_AS
.Różnica między wersjami tych konkretnych zestawień (tzn.
SQL_Latin1_General_CP1_CS_AS
ILatin1_General_100_CS_AS
) z rozróżnianiem małych i dużych liter polega na kolejności wielkich i małych liter podczas sortowania z rozróżnianiem małych i wielkich liter. Wpływa to również na jednoznakowe zakresy klas (tj.[start-end]
), Które mogą być używane zLIKE
operatorem iPATINDEX
funkcją. Poniższe trzy zapytania pokazują ten efekt zarówno dla sortowania, jak i zakresu znaków:Jedynym sposobem na sortowanie wielkich liter przed małymi literami (dla tej samej litery) jest użycie jednego z 31 zestawień, które obsługują to zachowanie, czyli
Hungarian_Technical_*
zestawień i garściSQL_
zestawień (które obsługują tylko to zachowanie dlaVARCHAR
danych ).Mniej ważne dla tej konkretnej zmiany, ale nadal warto o niej wiedzieć, ponieważ zmiana serwera na sortowanie binarne lub z rozróżnianiem wielkości liter ma wpływ, ponieważ sortowanie na poziomie serwera wpływa również na:
sysname
typu danychOznacza to, że jeśli ty lub „programista, który ostatnio opuścił”, który jest najwyraźniej odpowiedzialny za cały zły kod ;-) nie byłeś ostrożny z obudową i zadeklarował zmienną jako,
@SomethingID
ale później nazwał ją zmienną@somethingId
później, to by się zepsuło, gdybyś przeniósł się do sprawy -wrażliwe lub binarne sortowanie. Podobnie kod, który używasysname
typu danych, ale odnosi się do niego jakoSYSNAME
,SysName
lub coś innego niż wszystkie małe litery również ulegnie awarii, jeśli zostanie przeniesiony do instancji za pomocą sortowania z rozróżnianiem wielkości liter lub binarnym.źródło