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

Widok sys.columns (collation_name)

Termin Definicja
Widok sys.columns (collation_name)

Kolumna collation_name w sys.columns wskazuje kolację przypisaną do konkretnej kolumny tekstowej.

Widok sys.columns i znaczenie collation_name

Widok sys.columns jest katalogowym źródłem informacji o kolumnach należących do tabel i widoków w bazie SQL Server. Jednym z jego atrybutów jest collation_name, czyli nazwa reguł sortowania i porównywania tekstu przypisanych do konkretnej kolumny. Wartość ta opisuje sposób interpretowania znaków w danym polu, a nie samą zawartość przechowywanych danych. Dzięki temu można sprawdzić, czy dwie kolumny tekstowe korzystają z takich samych zasad porządku alfabetycznego, rozróżniania wielkości liter, znaków diakrytycznych oraz alfabetów.

Kolacja jest istotna przede wszystkim dla typów znakowych, takich jak char, varchar, nchar i nvarchar. Dla kolumn liczbowych, dat oraz innych typów nietekstowych collation_name zazwyczaj przyjmuje wartość NULL, ponieważ reguły sortowania tekstu nie mają do nich zastosowania. Samo odczytanie wartości z widoku nie zmienia ustawień tabeli ani sposobu działania zapytań. Pozwala jedynie ustalić, jakie zasady zostały zapisane w metadanych.

Przykładowe zapytanie może wyglądać następująco:

SELECT object_schema_name(object_id) AS schema_name, object_name(object_id) AS object_name, name, system_type_id, collation_name FROM sys.columns WHERE object_id = object_id(N'dbo.Klienci');

W praktyce do identyfikowania kolumn wygodniejsze bywa użycie OBJECT_SCHEMA_NAME i OBJECT_NAME w połączeniu z odpowiednim filtrowaniem. Należy pamiętać, że widoki katalogowe pokazują informacje w kontekście aktualnie wybranej bazy danych, dlatego przed analizą powinno się użyć właściwego polecenia USE albo wskazać bazę w narzędziu administracyjnym.

collation_name w sys.columns a dziedziczenie ustawień

Kolacja może zostać ustalona na kilku poziomach. Baza danych ma kolację domyślną, tabela nie stanowi jednak prostego niezależnego poziomu kolacji dla wszystkich swoich pól. Kolumna tekstowa zwykle dziedziczy ustawienie bazy w chwili utworzenia, chyba że jawnie określono inną kolację przy definicji kolumny. Z tego powodu zmiana domyślnej kolacji bazy nie musi automatycznie zmienić wartości widocznych w sys.columns. Istniejące kolumny zachowują swoje wcześniejsze ustawienia, dopóki nie zostaną świadomie zmodyfikowane.

W nazwie kolacji często występują skróty opisujące zachowanie porównań. Oznaczenie CI wskazuje na brak rozróżniania wielkości liter, natomiast CS oznacza rozróżnianie wielkości liter. Skrót AI oznacza zwykle nieuwzględnianie znaków diakrytycznych, a AS ich uwzględnianie. Występują także oznaczenia związane z alfabetem, kodowaniem, sortowaniem binarnym oraz zgodnością z określonymi regułami językowymi. Konkretne znaczenie zależy od pełnej nazwy, dlatego nie powinno się wyciągać wniosków wyłącznie z jednego fragmentu.

Różnica kolacji może ujawnić się przy operatorach =, LIKE, ORDER BY, GROUP BY oraz podczas łączenia danych. Dwa teksty, które wyglądają podobnie, mogą zostać uznane za równe w jednej kolacji, a za różne w innej. Dotyczy to także kluczy oraz indeksów, ponieważ reguły porównywania wpływają na kolejność i rozpoznawanie wartości. Przy porównywaniu wyrażeń pochodzących z różnych kolumn SQL Server stosuje reguły pierwszeństwa kolacji. Jeżeli nie da się uzgodnić kolacji automatycznie, pojawia się błąd konfliktu, który wymaga jawnego zastosowania klauzuli COLLATE.

Przykładowe wymuszenie reguły wyłącznie dla jednego porównania może mieć postać WHERE a.nazwa COLLATE Polish_100_CI_AI = b.nazwa COLLATE Polish_100_CI_AI. Takie rozwiązanie powinno być stosowane celowo, ponieważ przekształcenie kolumny w wyrażeniu może utrudnić wykorzystanie indeksu. Zmiana kolacji w samym zapytaniu nie naprawia niespójnego projektu danych, lecz pomaga kontrolować zachowanie konkretnej operacji.

Widok sys.columns (collation_name) przy typowych problemach

Jednym z częstszych problemów jest konflikt kolacji podczas łączenia dwóch tabel. Może pojawić się po imporcie danych z innej bazy, po połączeniu starszej tabeli z nową albo po użyciu tabel tymczasowych. Komunikat o konflikcie nie oznacza zwykle uszkodzenia danych. Informuje o tym, że porównywane wyrażenia tekstowe mają różne zasady interpretacji i silnik nie może bez dodatkowej wskazówki wybrać jednej z nich.

W pierwszej kolejności warto sprawdzić wartości collation_name dla obu kolumn, ich typy oraz długości. Należy także ustalić, czy problem dotyczy kolumn stałych, parametrów, literałów, tabel tymczasowych lub wyników funkcji. Sama nazwa kolacji nie wystarcza do pełnej diagnozy, ponieważ znaczenie ma również typ danych. W szczególności varchar i nvarchar mogą podlegać innym zasadom konwersji, a niejawne rzutowanie może zmieniać sposób wykonania zapytania.

Inny problem dotyczy pozornie duplikujących się wartości. Przy kolacji niewrażliwej na wielkość liter wartości takie jak zapis wielkimi i małymi literami mogą być traktowane jako równoważne, choć tekst pozostaje zapisany w różny sposób. Podobnie znaki diakrytyczne mogą być ignorowane albo rozróżniane. Skutkiem może być odrzucenie wartości przez indeks unikatowy, inny wynik grupowania lub zaskakująca liczba rekordów zwracanych przez filtr.

Wartość NULL w sys.columns.collation_name nie oznacza błędu. Najczęściej wskazuje, że kolumna nie jest tekstowa albo że wybrano obiekt, dla którego reguły tekstowe nie mają zastosowania. Przy analizie należy zestawić tę wartość z system_type_id, user_type_id, max_length i is_nullable. Dopiero taki zestaw informacji pozwala odróżnić prawidłową cechę metadanych od niepełnego lub błędnego założenia w skrypcie kontrolnym.

collation_name — praktyczne wskazówki diagnostyczne

Kontrolę najlepiej rozpocząć od zebrania listy kolumn tekstowych i ich kolacji w obrębie jednej bazy. Przydatne jest filtrowanie po typach znakowych oraz porównanie kolumn, które uczestniczą w relacjach, wyszukiwaniu i sortowaniu. W przypadku większej liczby tabel warto zapisać wynik zapytania do raportu technicznego, aby można było wykryć pojedyncze odstępstwa od przyjętej konwencji.

Przed zmianą kolacji powinno się sprawdzić zależności. Znaczenie mają indeksy, indeksy unikatowe, klucze, ograniczenia, kolumny obliczane, widoki oraz procedury wykorzystujące daną kolumnę. Zmiana może wymagać przebudowy indeksu albo czasowego usunięcia zależności i ich ponownego utworzenia. Warto też wykonać próbę na kopii danych, ponieważ kolacja wpływa nie tylko na nowe rekordy, ale również na porównywanie rekordów już istniejących.

Zmiana definicji zwykle jest wykonywana poleceniem ALTER TABLE ... ALTER COLUMN z pełnym typem danych, długością, informacją o dopuszczaniu wartości pustych oraz żądaną klauzulą COLLATE. Pominięcie któregoś elementu może spowodować niezamierzoną zmianę definicji. Przed wykonaniem operacji należy sprawdzić, czy dane mieszczą się w docelowym typie i czy nowa reguła nie powoduje kolizji wartości uznawanych dotąd za różne.

Przy ocenie wydajności nie powinno się zakładać, że każda klauzula COLLATE jest neutralna. Zastosowanie jej do kolumny w warunku może wymusić obliczenie wyrażenia dla wielu wierszy i ograniczyć możliwość użycia istniejącego indeksu. Jeżeli jednolite zasady są potrzebne stale, trwalszym rozwiązaniem bywa uporządkowanie definicji kolumn i powiązanych obiektów. Doraźna klauzula jest przydatna w migracji, porównaniu źródeł lub kontrolowanym raporcie, ale powinna być udokumentowana.

Widok sys.columns (collation_name) — kiedy zgłosić się do serwisu

Do serwisu warto zgłosić się wtedy, gdy konflikt kolacji pojawia się w wielu zapytaniach, po migracji danych występują nieoczekiwane różnice w wyszukiwaniu albo zmiana definicji kolumny wymaga sprawdzenia zależności. Pomoc może obejmować odczyt metadanych z sys.columns, porównanie ustawień bazy i kolumn, analizę komunikatów błędów oraz przygotowanie bezpiecznej kolejności zmian. Szczególnej ostrożności wymaga sytuacja, w której tekstowe identyfikatory są używane w indeksach unikatowych lub w relacjach między tabelami.

Wsparcie w tym zakresie świadczy Warszawskie Pogotowie Komputerowe 24/7. Przed rozpoczęciem prac powinno się przygotować nazwę bazy, nazwy tabel, przykładowe zapytanie powodujące problem oraz informację o tym, czy błąd występuje stale, czy tylko przy konkretnym filtrze lub połączeniu. Takie dane ułatwiają odtworzenie sytuacji i ograniczają ryzyko modyfikowania ustawień bez rozpoznania zależności.

Nie każda różnica wartości collation_name wymaga ujednolicenia. Odmienne kolacje mogą być uzasadnione, gdy jedna kolumna służy do wyszukiwania według lokalnych reguł językowych, a inna przechowuje techniczne identyfikatory. Istotne jest, aby różnica była świadoma, opisana i zgodna z przeznaczeniem danych. Jeżeli zachowanie sortowania lub porównań nie odpowiada wymaganiom aplikacji, analiza widoku sys.columns stanowi dobry punkt wyjścia do ustalenia przyczyny i zaplanowania poprawki.

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