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 zmiennej

Termin Definicja
Kolacja zmiennej

Kolacja zmiennej to ustawienie sortowania przypisane do zadeklarowanej zmiennej tekstowej w kodzie Transact-SQL.

Kolacja zmiennej w języku Transact-SQL

Kolacja zmiennej to ustawienie reguł porównywania i sortowania tekstu przypisane do zmiennej zadeklarowanej w języku Transact-SQL używanym przez Microsoft SQL Server. Kolacja określa między innymi sposób traktowania wielkości liter, znaków diakrytycznych, alfabetu oraz kolejności znaków podczas operacji tekstowych. Przykładowo kolacja niewrażliwa na wielkość liter może uznać wartości abc i ABC za równoważne przy porównaniu, natomiast kolacja wrażliwa na wielkość liter może potraktować je jako różne.

Ustawienie kolacji ma znaczenie dla typów znakowych, takich jak char, varchar, nchar i nvarchar. W praktyce wpływa na operatory porównania, predykaty LIKE, sortowanie za pomocą ORDER BY, działanie funkcji agregujących oraz niektóre operacje łączenia tekstu. Sama zmienna przechowuje znaki, ale sposób ich interpretowania podczas operacji zależy od przypisanej kolacji i od reguł rozstrzygania kolacji obowiązujących w danym wyrażeniu.

Jawne przypisanie kolacji przy deklarowaniu zmiennej

W deklaracji zmiennej można użyć klauzuli COLLATE, aby wskazać konkretną nazwę kolacji. Przykładowa deklaracja w SQL Server może wyglądać następująco: DECLARE @Nazwa nvarchar(100) COLLATE Polish_100_CI_AI;. W tym przykładzie Polish_100_CI_AI jest nazwą kolacji, a przyrostki CI i AI oznaczają odpowiednio niewrażliwość na wielkość liter oraz niewrażliwość na akcenty. Dobór nazwy musi odpowiadać kolacjom zainstalowanym i obsługiwanym przez konkretną instancję SQL Server.

Kolację można także zastosować do zmiennej już w wyrażeniu, na przykład podczas porównania: WHERE Kolumna = @Nazwa COLLATE Polish_100_CI_AI. Takie użycie zmienia kolację tego wystąpienia wyrażenia, a niekoniecznie sposób zadeklarowania samej zmiennej. Klauzula COLLATE może być również użyta z wartością tekstową, kolumną albo innym wyrażeniem znakowym, jeśli zachodzi potrzeba jawnego ujednolicenia reguł porównania.

Kolacja zmiennej a konflikt reguł porównywania

Problem pojawia się wtedy, gdy zmienna tekstowa jest używana razem z kolumną lub literałem mającym inną kolację. SQL Server stosuje reguły priorytetu kolacji, aby ustalić, która definicja obowiązuje w wyniku działania. Jeżeli nie da się uzgodnić kolacji automatycznie, zapytanie może zakończyć się błędem konfliktu kolacji. Jawne użycie COLLATE pozwala wskazać regułę, według której ma zostać wykonane porównanie.

Kolacja wpływa również na wyniki zapytań pozornie niezwiązanych z deklaracją zmiennej. Wyszukiwanie przez LIKE może zwrócić inną liczbę wierszy przy zmianie wrażliwości na wielkość liter lub akcenty. Sortowanie wartości z tabeli i zmiennej może przebiegać według odmiennych zasad, jeśli obie strony wyrażenia używają różnych kolacji. Trzeba też odróżnić kolację od kodowania: kolacja definiuje reguły porównywania znaków, natomiast typ nvarchar przechowuje tekst w formacie Unicode i nie zastępuje właściwego doboru reguł sortowania.

W deklaracjach zmiennych spotyka się również zapis COLLATE database_default. Oznacza on użycie domyślnej kolacji bieżącej bazy danych dla danego wyrażenia. Jest to przydatne, gdy kod ma działać w bazach o różnych ustawieniach, ale nie rozwiązuje wszystkich problemów: kolacja kolumny, tabeli tymczasowej albo innej bazy może nadal być odmienna. Szczególną uwagę należy zachować przy tabelach tymczasowych, ponieważ ich kolumny mogą dziedziczyć ustawienia bazy tempdb, a nie bazy, w której uruchomiono procedurę.

Sprawdzanie i diagnozowanie ustawienia kolacji

Przy analizie niezgodności należy sprawdzić kolację instancji, bazy danych, kolumny oraz samego wyrażenia zawierającego zmienną. Informacje o kolacji bazy można odczytać z widoku katalogowego sys.databases, korzystając z kolumny collation_name. Dla kolumn tabeli pomocny jest widok sys.columns, który dla typów znakowych udostępnia właściwość collation_name. Warto porównać te wartości z nazwą kolacji używaną jawnie w deklaracji lub klauzuli COLLATE.

Podczas diagnostyki należy wykonać testy obejmujące wielkość liter, polskie znaki, sortowanie i wzorce LIKE. Przykładowo można porównać wartości Łódź, łódź i Lodz, pamiętając, że wynik zależy od konkretnej kolacji, a nie tylko od języka ustawionego w systemie operacyjnym. Jeżeli zapytanie zawiera indeksowaną kolumnę i wymusza COLLATE po stronie kolumny, należy dodatkowo sprawdzić plan wykonania, ponieważ przekształcenie kolumny może ograniczyć możliwość efektywnego użycia indeksu. Przy błędach warto zapisać pełną deklarację zmiennej, typ danych, nazwę kolacji oraz fragment zapytania, w którym występuje porównanie.

W przypadku problemów z działaniem aplikacji diagnostyka powinna objąć zarówno kod zapytania Transact-SQL, jak i konfigurację bazy oraz definicje tabel. Nieprawidłowy wynik nie musi oznaczać uszkodzenia danych; często przyczyną jest niespójny dobór kolacji między zmienną, kolumną i literałem tekstowym. Neutralna analiza laptopa lub komputera PC może potwierdzić, czy problem wynika z oprogramowania bazodanowego, konfiguracji środowiska lub błędu w kodzie wykonywanym na urządzeniu.

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