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

Funkcje T-SQL a kolacja

Termin Definicja
Funkcje T-SQL a kolacja

Funkcje T-SQL a kolacja opisują wpływ ustawień sortowania znaków na wynik działania funkcji tekstowych.

Collation w SQL Server i jej wpływ na tekst

W SQL Server poprawny termin to collation, po polsku często określany jako sortowanie lub reguły porównywania znaków. Collation definiuje sposób porównywania i sortowania danych tekstowych, a także znaczenie takich cech jak wielkość liter, akcenty, szerokość znaków i typ japońskich kana. Przykładowo Latin1_General_100_CI_AS oznacza między innymi porównywanie niewrażliwe na wielkość liter (CI) i wrażliwe na akcenty (AS). Wariant CS rozróżnia wielkość liter, a AI ignoruje różnice akcentowe.

Collation może być określona na poziomie serwera, bazy danych, kolumny, wyrażenia albo stałej tekstowej. Najbardziej szczegółowe ustawienie ma zastosowanie podczas konkretnej operacji, dlatego dwie kolumny typu nvarchar mogą przechowywać Unicode, ale nadal różnić się wynikami porównań. Sam typ danych nie przesądza o tym, czy tekst ABC jest równy abc. O wyniku decydują reguły collation użyte przez SQL Server w danym wyrażeniu.

Funkcje porównujące i wyszukujące znaki

Collation bezpośrednio wpływa na funkcje T-SQL, które wykonują porównania lub wyszukują fragmenty tekstu. Dotyczy to między innymi operatorów =, <>, LIKE, a także funkcji CHARINDEX i PATINDEX. Przy collation niewrażliwej na wielkość liter wyrażenie CHARINDEX('sql', 'SQL Server') może zwrócić pozycję początku znalezionego tekstu, ponieważ sql i SQL są traktowane jako równoważne. Przy collation oznaczonej jako CS taki wynik może wynosić zero, gdyż wielkość liter ma znaczenie.

Podobnie działają porównania znaków diakrytycznych. W collation AI litery różniące się akcentem mogą być uznane za równoważne, natomiast w collation AS są rozróżniane. Ma to znaczenie dla warunków WHERE, filtrowania wyników, wyszukiwania prefiksów oraz dopasowania wzorców w operatorze LIKE. Funkcje REPLACE i TRANSLATE również wykonują operacje na konkretnych znakach lub ciągach, więc przy pracy z danymi tekstowymi trzeba sprawdzić, czy użyta collation nie powoduje niezamierzonego uznania dwóch zapisów za takie same.

Długość tekstu, pozycje znaków i Unicode

Nie wszystkie funkcje tekstowe reagują na collation w ten sam sposób. LEN zwraca liczbę znaków, ale pomija końcowe spacje, natomiast DATALENGTH zwraca liczbę bajtów zajmowanych przez dane. Dla kolumny nvarchar długość w bajtach zwykle nie jest tym samym co liczba znaków. Funkcje LEFT, RIGHT i SUBSTRING wyznaczają fragmenty tekstu według pozycji znaków, a wynik może zależeć od tego, czy użyta collation obsługuje znaki dodatkowe.

W SQL Server collations z sufiksem _SC prawidłowo traktują pary zastępcze UTF-16 jako pojedyncze znaki Unicode w funkcjach obsługujących długość i pozycję tekstu. Dotyczy to między innymi LEN, SUBSTRING, LEFT, RIGHT, CHARINDEX i PATINDEX. Bez odpowiedniej collation znak spoza podstawowej płaszczyzny Unicode może zostać policzony jako dwa elementy kodowania UTF-16. Dlatego przy przechowywaniu symboli emoji, wybranych znaków matematycznych lub innych znaków spoza BMP należy uwzględnić zarówno typ nvarchar, jak i collation z obsługą _SC. Collations UTF-8, oznaczane sufiksem _UTF8, dotyczą kolumn typu char i varchar; nie zmieniają one faktu, że nvarchar korzysta z kodowania Unicode UTF-16.

Jawne COLLATE i kontrola wyników zapytań

Jeżeli operacja ma używać określonych reguł, można wskazać collation bezpośrednio za pomocą klauzuli COLLATE. Przykład WHERE Nazwa COLLATE Latin1_General_100_CI_AS = @SzukanyTekst wymusza użycie wskazanych zasad dla tego porównania. Takie rozwiązanie pozwala kontrolować wrażliwość na wielkość liter lub akcenty bez zmiany definicji całej kolumny. Trzeba jednak stosować je świadomie, ponieważ użycie COLLATE w wyrażeniu może ograniczyć możliwość wykorzystania indeksu i zwiększyć koszt filtrowania dużej tabeli.

Problemy z collation pojawiają się także przy łączeniu danych z różnych baz lub tabel. SQL Server stosuje reguły pierwszeństwa collation, a w przypadku niezgodności może zgłosić błąd konfliktu podczas porównania albo łączenia kolumn tekstowych. Jawne wskazanie wspólnej collation w warunku JOIN lub WHERE usuwa niejednoznaczność, ale powinno odpowiadać wymaganej semantyce danych. Podczas diagnostyki zapytania warto sprawdzić definicję kolumn przez widoki katalogowe, między innymi sys.columns i sys.databases, oraz przeanalizować rzeczywisty tekst zapytania. Różnice w wynikach funkcji T-SQL często nie wynikają z uszkodzenia danych, lecz z tego, że operacja została wykonana pod inną collation niż zakładano.

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