Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Kolacja a zgodność wersji

Termin Definicja
Kolacja a zgodność wersji

Zależność kolacji od zgodności wersji dotyczy dostępności nowszych reguł sortowania w starszych wydaniach SQL Server.

Kolacja w SQL Server a numer wersji silnika

W SQL Server „kolacja” oznacza collation, czyli zestaw reguł określających sposób porównywania i sortowania danych tekstowych. Kolacja wpływa między innymi na kolejność znaków, rozróżnianie wielkości liter, rozróżnianie znaków diakrytycznych oraz interpretację niektórych znaków alfabetów narodowych. Zgodność kolacji z wersją SQL Server ma znaczenie wtedy, gdy baza lub zapytanie korzysta z reguł sortowania wprowadzonych dopiero w nowszym wydaniu silnika.

SQL Server zapisuje kolację jako nazwę zawierającą rodzinę reguł, a często także wersję tych reguł. Przykładowo nazwy takie jak Latin1_General_100_CI_AS i Latin1_General_140_CI_AS wskazują na różne generacje reguł sortowania. Sufiks CI oznacza porównywanie niewrażliwe na wielkość liter, a AS — wrażliwość na znaki diakrytyczne. Sama zgodność kodowania znaków nie wystarcza, ponieważ kolacja jest również częścią metadanych używanych przy porównywaniu wartości tekstowych.

Reguły sortowania wprowadzone w nowszych wydaniach

Nowsze wersje SQL Server mogą zawierać dodatkowe kolacje lub nowsze wersje istniejących rodzin kolacji. Reguły te są związane z aktualizacjami standardu Unicode, zmianami w sortowaniu znaków oraz obsługą kolejnych języków i symboli. Kolacja dostępna w SQL Server 2017 nie musi być dostępna w starszym SQL Server 2012, nawet jeśli oba silniki obsługują podobne rodziny kolacji i typy danych, takie jak nvarchar.

Problem pojawia się przy przenoszeniu skryptu, bazy danych albo definicji obiektu do starszego środowiska. Jeżeli skrypt zawiera nazwę kolacji nierozpoznawaną przez docelową wersję SQL Server, wykonanie instrukcji może zakończyć się błędem. Dotyczy to na przykład deklaracji kolumny, wyrażenia z klauzulą COLLATE, definicji indeksowanego obiektu albo procedury składowanej zawierającej jawne wymuszenie kolacji. Silnik nie może zastosować reguły, której nie ma w swoim katalogu obsługiwanych kolacji.

Nie należy utożsamiać numeru kolacji z numerem wersji całego serwera. O dostępności konkretnej kolacji decyduje implementacja danego wydania SQL Server oraz zainstalowane aktualizacje, a nie tylko zgodność nazwy produktu z ogólną rodziną SQL. Przy migracji trzeba więc sprawdzić rzeczywistą listę kolacji w środowisku docelowym, zamiast zakładać, że każda kolacja obecna w nowszym serwerze będzie dostępna w starszym.

Sprawdzanie dostępności kolacji przed migracją

Listę kolacji obsługiwanych przez uruchomioną instancję można sprawdzić za pomocą widoku katalogowego sys.fn_helpcollations(). Przykładowe zapytanie to SELECT name, description FROM sys.fn_helpcollations() WHERE name = N'Latin1_General_140_CI_AS';. Jeżeli zapytanie nie zwróci wiersza, wskazana kolacja nie jest dostępna w tej instancji i nie powinna zostać użyta bez modyfikacji skryptu.

Warto osobno sprawdzić kolację serwera, bazy danych i poszczególnych kolumn. Kolację serwera można odczytać z właściwości instancji, na przykład przez SELECT SERVERPROPERTY('Collation');. Kolację bazy danych pokazuje zapytanie SELECT name, collation_name FROM sys.databases;, natomiast kolacje kolumn tekstowych można znaleźć w sys.columns połączonym z sys.tables, ponieważ kolumna może mieć ustawienie inne niż domyślna kolacja bazy.

Przy analizie zgodności trzeba również zweryfikować typy danych. varchar zależy od strony kodowej wynikającej z kolacji, natomiast nvarchar przechowuje dane w formacie Unicode, ale nadal podlega regułom kolacji podczas porównań i sortowania. Zastąpienie jednej kolacji inną może zmienić wyniki operatorów =, LIKE, ORDER BY i operacji grupowania. Może także ujawnić konflikt kolacji w zapytaniu łączącym tekst z dwóch baz lub tabel.

Konsekwencje użycia niezgodnej kolacji

Najbardziej oczywistą konsekwencją jest błąd podczas tworzenia albo odtwarzania obiektu, gdy starszy SQL Server nie rozpoznaje nazwy kolacji. Innym przypadkiem jest konflikt między dwoma różnymi kolacjami, który może wystąpić podczas porównywania kolumn tekstowych pochodzących z odmiennych baz danych. W takiej sytuacji zapytanie może wymagać jawnego użycia klauzuli COLLATE wskazującej kolację dostępną w konkretnym środowisku.

Zmiana kolacji na starszą lub bardziej ogólną nie jest neutralną zamianą techniczną. Może zmienić kolejność sortowania, wynik porównań znaków, działanie unikatowych indeksów oraz rezultat grupowania. Jeżeli dwie wartości były rozróżniane przez wcześniejszą kolację, ale według nowej reguły są traktowane jako równoważne, utworzenie indeksu UNIQUE może się nie powieść albo może ujawnić duplikaty logiczne. Przed zmianą należy przeanalizować dane, indeksy, klucze, zapytania i zależności między bazami.

W praktyce zgodność wersji kolacji w SQL Server należy kontrolować przed migracją, przywracaniem kopii zapasowej, wdrażaniem skryptów oraz zmianą poziomu zgodności bazy. Diagnostyka powinna obejmować wersję instancji, dostępne kolacje, ustawienia bazy i kolumn oraz testy porównań na reprezentatywnych danych. Takie sprawdzenie pozwala odróżnić problem braku obsługi konkretnej kolacji od problemu konfliktu reguł sortowania między obiektami.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę