| Termin | Definicja |
|---|---|
| NCHAR | NCHAR to typ danych SQL Server przechowujący tekst o stałej długości w kodowaniu Unicode. NCHAR jako typ danych dla tekstu UnicodeNCHAR jest typem danych stosowanym w języku SQL Server do przechowywania tekstu zapisanego w standardzie Unicode. Jego najważniejszą cechą jest stała długość pola. Oznacza to, że podczas definiowania kolumny wskazuje się maksymalną liczbę znaków, a baza rezerwuje miejsce odpowiadające tej długości. W praktyce NCHAR sprawdza się wtedy, gdy wartości mają zbliżony rozmiar albo gdy jednolity format danych ułatwia dalsze przetwarzanie. Unicode pozwala przechowywać znaki używane w wielu alfabetach, w tym polskie litery, takie jak ą, ć, ę, ł, ń, ó, ś, ź i ż. Możliwe jest także zapisywanie znaków cyrylicy, alfabetów azjatyckich oraz innych symboli obsługiwanych przez używaną wersję SQL Server. Dzięki temu dane nie muszą być upraszczane do podstawowego alfabetu łacińskiego. NCHAR różni się od zwykłych typów znakowych przeznaczonych dla ograniczonych zestawów znaków, ponieważ został zaprojektowany z myślą o pełniejszej obsłudze tekstu wielojęzycznego. Przykładowa definicja może wyglądać następująco:
W takim przypadku kolumna KodKraju może przechowywać dwuznakowe oznaczenie, a kolumna Imie ma z góry ustaloną szerokość trzydziestu znaków. Warto pamiętać, że liczba podana przy NCHAR określa liczbę znaków, a nie bezpośrednio liczbę bajtów. Szczegółowe zużycie pamięci zależy od sposobu reprezentacji znaków w danej wersji środowiska oraz od właściwości przechowywanych danych. NCHAR a długość stała i porównanie z NVARCHARNajczęściej NCHAR porównuje się z typem NVARCHAR. Oba typy obsługują Unicode, lecz różnią się sposobem traktowania długości wartości. NCHAR ma długość stałą, natomiast NVARCHAR pozwala przechowywać tekst o długości zmiennej, do ustalonego limitu. Jeżeli zdefiniowano NCHAR(10), a zapisany tekst ma pięć znaków, pozostała część pola może zostać uzupełniona do wymaganej szerokości. Przy NVARCHAR(10) przechowywana wartość zajmuje miejsce bardziej odpowiadające rzeczywistej długości tekstu. Różnica ma znaczenie podczas projektowania tabel. NCHAR może być wygodny dla kodów, skrótów, oznaczeń, symboli krajów, identyfikatorów o równym formacie oraz innych wartości, których długość jest z założenia stała. NVARCHAR zwykle lepiej pasuje do imion, nazw, opisów, tytułów i komunikatów, ponieważ takie dane mogą znacznie różnić się długością. Użycie NCHAR dla długich i niejednorodnych opisów może prowadzić do niepotrzebnego zajmowania miejsca oraz do mniej przejrzystego zachowania podczas odczytu. Warto również rozróżnić NCHAR od CHAR. CHAR służy do przechowywania znaków w określonym kodowaniu jednobajtowym lub zależnym od kolacji, natomiast NCHAR jest wariantem przeznaczonym dla Unicode. Jeśli aplikacja działa w środowisku wielojęzycznym, wybór NCHAR może ograniczyć ryzyko utraty znaków diakrytycznych. Sam typ nie rozwiązuje jednak wszystkich problemów. Znaczenie mają także kolumny, ustawienia kolacji, sterownik połączenia oraz sposób przekazywania parametrów przez aplikację. Przy porównywaniu wartości trzeba uwzględnić wpływ uzupełniania do stałej długości. W zależności od operacji i ustawień SQL Server końcowe spacje mogą być traktowane w sposób, który różni się od intuicyjnych oczekiwań. Dotyczy to zwłaszcza porównań, sortowania, indeksów oraz konwersji pomiędzy typami znakowymi. Dlatego testy powinny obejmować tekst krótszy od deklarowanej długości, tekst dokładnie takiej długości, znaki narodowe i końcowe spacje. NCHAR w typowych problemach z bazą danychJednym z częstych problemów jest użycie NCHAR w tabeli, w której długość danych jest zmienna. Przykładowo kolumna przeznaczona na rozbudowany opis może zostać zdefiniowana jako NCHAR(500), mimo że większość wpisów zawiera zaledwie kilkadziesiąt znaków. Taka konstrukcja komplikuje ocenę rozmiaru tabeli i może zwiększać koszty operacji wejścia i wyjścia. W podobnym przypadku należy rozważyć NVARCHAR, ponieważ lepiej odwzorowuje charakter tekstu. Innym problemem bywa nieprawidłowe wyświetlanie polskich znaków. Przyczyną może być nie tylko sam typ kolumny, ale także brak prefiksu Unicode przy stałych tekstowych, błędna deklaracja parametrów lub niezgodna kolacja. W zapytaniach zawierających literały tekstowe warto stosować zapis z prefiksem N, na przykład:
Prefiks informuje silnik, że przekazywany literał powinien być traktowany jako Unicode. Bez niego wynik może zależeć od kolacji i ustawień połączenia, a niektóre znaki mogą zostać zastąpione innymi symbolami albo znakami zapytania. Należy też sprawdzić, czy aplikacja wysyła parametry jako Unicode, ponieważ poprawnie zdefiniowana kolumna nie naprawi danych uszkodzonych jeszcze przed zapisem. Trudności mogą pojawić się także przy imporcie danych z plików tekstowych. Plik zapisany w innym kodowaniu może zostać odczytany nieprawidłowo, zanim wartości trafią do kolumny NCHAR. W takiej sytuacji przydatne jest ustalenie kodowania źródła, sprawdzenie ustawień narzędzia importu oraz porównanie danych przed i po zapisaniu. Warto unikać pochopnej konwersji tekstu do ograniczonego zestawu znaków, ponieważ może ona trwale usunąć informacje. Osobną kwestią są migracje pomiędzy systemami baz danych. Typ o tej samej nazwie lub podobnym zastosowaniu nie zawsze ma identyczne zasady długości, sortowania i przechowywania znaków. Przed przeniesieniem tabel należy sprawdzić mapowanie typów, kolacje, ograniczenia długości oraz zachowanie wartości pustych i spacji. Szczególnej uwagi wymagają kody, które wyglądają jak liczby, lecz w rzeczywistości są tekstem, na przykład oznaczenia z zerami na początku. NCHAR i praktyczne wskazówki projektowePrzed użyciem NCHAR warto opisać znaczenie kolumny oraz określić, czy jej długość rzeczywiście jest stała. Kod państwa, dwuliterowy symbol języka lub ustalone oznaczenie statusu może być dobrym kandydatem. Nazwa osoby, adres, tytuł dokumentu i opis zazwyczaj mają charakter zmienny, więc często lepiej przechowywać je w typie o zmiennej długości. Decyzja powinna wynikać z modelu danych, a nie wyłącznie z przyzwyczajenia do określonego typu. Należy ustalić rozsądne ograniczenie długości. Zbyt mała wartość może prowadzić do obcinania danych lub błędów podczas zapisu, natomiast zbyt duża utrudnia kontrolę jakości i może niepotrzebnie wpływać na wydajność. Ograniczenie powinno wynikać z reguł biznesowych, dokumentacji formatu albo obserwacji wiarygodnych danych wejściowych. W aplikacji przydatna jest dodatkowa walidacja, aby użytkownik otrzymał czytelny komunikat jeszcze przed wysłaniem wartości do bazy. Podczas testowania należy użyć znaków z różnych alfabetów, znaków diakrytycznych, wartości krótkich, wartości granicznych oraz tekstu zawierającego spacje na końcu. Trzeba zweryfikować zapis, odczyt, filtrowanie, sortowanie i eksport. Dobrą praktyką jest wykonanie kopii danych przed zmianą typu kolumny oraz sprawdzenie zapytań korzystających z tej kolumny. Zmiana z NCHAR na NVARCHAR albo w przeciwnym kierunku może wpływać na indeksy, procedury, widoki, integracje i warstwę aplikacyjną. Warto zwrócić uwagę na parametry zapytań. Parametryzacja ogranicza ryzyko błędów składniowych i ułatwia prawidłowe przekazywanie znaków Unicode. Należy unikać składania zapytań przez łączenie fragmentów tekstu dostarczonych przez użytkownika. Odpowiedzialne przechowywanie danych obejmuje również kontrolę uprawnień, kopie zapasowe i okresowe sprawdzanie, czy wartości nie zostały zmienione w wyniku nieprawidłowej konwersji. NCHAR jako sygnał do zgłoszenia problemuDo serwisu komputerowego warto zgłosić się wtedy, gdy tekst zapisany w bazie zaczyna wyświetlać się jako znaki zapytania, pojawiają się nieoczekiwane spacje, wyszukiwanie przestaje znajdować istniejące wartości albo import danych zmienia polskie litery. Pomoc może być potrzebna również po migracji systemu, zmianie aplikacji, aktualizacji sterowników lub odtworzeniu bazy z kopii. Przed zgłoszeniem dobrze przygotować przykładowe wartości, opis momentu wystąpienia problemu, nazwę używanej aplikacji oraz informację, czy błąd dotyczy wszystkich rekordów, czy tylko wybranych. W Warszawie takie problemy może przyjąć Warszawskie Pogotowie Komputerowe 24/7, gdzie analizuje się konfigurację komputera, sposób połączenia z bazą, ustawienia aplikacji i możliwe błędy zapisu. Przed zmianą struktury danych wskazane jest wykonanie kopii zapasowej oraz ustalenie, czy problem dotyczy samej kolumny NCHAR, czy całego łańcucha wymiany danych. Dzięki temu łatwiej oddzielić problem kodowania od problemu długości stałej, kolacji lub nieprawidłowego parametru. NCHAR nie jest typem uniwersalnym dla każdego tekstu, ale pozostaje użytecznym rozwiązaniem tam, gdzie stały format i obsługa Unicode są rzeczywiście potrzebne. Świadomy dobór między NCHAR, NVARCHAR oraz innymi typami znakowymi ułatwia utrzymanie spójnych danych, poprawia czytelność modelu i ogranicza liczbę trudnych do wykrycia błędów podczas zapisu oraz odczytu. |