Jedną z właściwości SQL Servera jest collation (nie pytajcie mnie o polskie określenie, bo takowego nie znam, a przecież nie spolszczę tego słówka na kolację). Żeby nieco przybliżyć sens używania i definiowania właściwej wartości collation, pozwolę sobie zacytować odpowiedni fragment Books Online:
| Collations specify the rules for how strings of character data are sorted and compared, based on the norms of particular languages and locales. For example, in an ORDER BY clause, an English speaker would expect the character string 'Chiapas' to come before 'Colima' in ascending order. But a Spanish speaker in Mexico might expect words beginning with 'Ch' to appear at the end of a list of words starting with 'C'. Collations dictate these kinds of sorting and comparison rules. The Latin_1 General collation will sort 'Chiapas' before 'Colima' in an ORDER BY ASC clause, while the Traditional_Spanish collation will sort 'Chiapas' after 'Colima'. |
Opis powyżej jak najbardziej prawidłowo oddaje charakter tej właściwości serwera i jest równocześnie tak mylący i niepełny jak tylko się to dało napisać. Skąd taka opinia? Zanim odpowiem na to pytanie, podzielę się z Wami ostatnimi błędami, które zdarzyły mi się podczas różnych prób instalacji SQL Serwera.
1) Instalujemy SQL Server 2005 na polskim systemie Windows 2000. Instalacja przeprowadzana jest w trybie silent, parametry instalacji wyspecyfikowane są w pliku *.ini, jednym z nich jest linia SQLCOLLATION="SQL_Latin1_General_Pref_CP1_CI_AS". Instalacja kończy się błędem, ponieważ instalator nie jest w stanie znaleźć użytkownika ZARZADZANIE NT\SYSTEM. Powód? Usługa SQL Servera jest zakładana nie przez instalatora a przez proces serwera. Ten pobiera sobie łańcuch z nazwą użytkownika, przepuszcza go przez swoje funkcje przetwarzania łańcuchów (korzystające oczywiście ze zdefiniowanego collation) i „gubi” po drodze Ą przekształcając je do A. Rozwiązanie polegało na zamianie linii w pliku konfiguracyjnym na SQLCOLLATION="SQL_Polish_Cp1250_CI_AS".
2) Collation definiuje nie tylko kolejność sortowania, ale także rozróżnianie małych i wielkich liter czy akcentów. I tak powyższe SQL_Polish_Cp1250_CI_AS oznacza sortowanie niezależne od wielkości liter (case-insentitive) i zależne od akcentu (accent-sensitive). Ciekawe efekty dało użycie SQL_Polish_Cp1250_CS_AS z sortowaniem zależnym od wielkości liter. Najpierw program konfigurujący nie był się w stanie połączyć z serwerem zwracając lakoniczny komunikat „Błąd logowania użytkownika SA”. Widzicie już powód? Tak, w bazie master nie ma loginu SA, jest sa. Po poprawieniu nazwy użytkownika w kodzie programu otrzymałem jeszcze kilka błędów, jak np. niemożność uruchomienia skryptu T-SQL, w którym do zadeklarowanej zmiennej @Cmd odwoływałem się poprzez @cmd.
Tak więc odpowiednie zdefiniowanie collation w SQL Serwerze to nie tylko określenie kolejności sortowania danych. Wartość ta ma wpływ na wszystkie teksty przetwarzane przez serwer – od nazw kolumn po zmienne w skryptach nie wspominając już o parametrach procedur. Na szczęście nie wpływa ona na słowa kluczowe T-SQL – bez względu na zdefiniowanie collation zarówno select jak SELECT i SeLeCt są napisane poprawnie.