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

Typy danych między wersjami SQL Server

Termin Definicja
Typy danych między wersjami SQL Server

Niektóre typy danych zmieniały zachowanie między wersjami SQL Server, co warto sprawdzić przed migracją.

Typy danych wprowadzone w SQL Server 2008

Przy porównywaniu schematów między wersjami SQL Server warto najpierw rozróżnić typy dostępne od dawna od typów wprowadzonych w konkretnych wydaniach silnika. SQL Server 2008 dodał między innymi typy date, time, datetime2 i datetimeoffset. Wcześniejszy typ datetime przechowuje datę i czas z dokładnością około 3,33 milisekundy, natomiast datetime2 pozwala określić precyzję od 0 do 7 cyfr części ułamkowej sekundy. Typ date przechowuje wyłącznie datę, a time wyłącznie godzinę. Dzięki temu migracja z wcześniejszego modelu opartego na datetime może wymagać zmiany zapytań, parametrów i mapowania typów w aplikacji.

datetimeoffset przechowuje datę, czas oraz przesunięcie względem czasu UTC, na przykład +01:00 albo +02:00. Nie jest to jednak typ przechowujący nazwę strefy czasowej ani reguły przejścia na czas letni. Podczas migracji trzeba więc ustalić, czy aplikacja zapisuje rzeczywisty punkt w czasie, lokalną datę i godzinę, czy tylko informację o przesunięciu. Zmiana kolumny z datetime na datetime2 może poprawić zakres i dokładność zapisu, ale nie odtworzy informacji o strefie czasowej, której wcześniej nie zapisano.

Typy przestarzałe i ich zamienniki

SQL Server nadal rozpoznaje typy text, ntext i image, ale są one oznaczone jako przestarzałe i nie powinny być stosowane w nowych tabelach. Ich funkcjonalne zamienniki to odpowiednio varchar(max), nvarchar(max) oraz varbinary(max). Typy z przyrostkiem max mogą przechowywać wartości większe niż zwykłe typy o ograniczonym rozmiarze, a jednocześnie obsługują współczesne funkcje operowania na dużych wartościach znakowych lub binarnych.

W migracji nie wystarczy mechanicznie podmienić deklaracji kolumn. Typy text i ntext mają odrębne ograniczenia dotyczące części funkcji i operatorów, dlatego po zmianie należy sprawdzić procedury składowane, wyzwalacze, widoki oraz kod aplikacji. Istotne są także parametry procedur i wartości zwracane przez funkcje. Przykładowo użycie varchar(max) zamiast text może wymagać zmiany deklaracji parametru, konwersji w zapytaniu lub sposobu odczytu danych przez sterownik. Kolumn typu image nie należy mylić z formatem pliku graficznego; jest to ogólny typ danych binarnych, którego zamiennikiem jest varbinary(max).

Osobnego wyjaśnienia wymaga słowo kluczowe timestamp. W SQL Server nie oznacza ono daty ani godziny. Jest historycznym synonimem typu rowversion, który przechowuje automatycznie generowaną wartość binarną używaną do wykrywania zmian w wierszu. Wartość rowversion nie jest gwarantowanym czasem wykonania operacji i nie powinna być konwertowana na datę. W nowych definicjach zaleca się używanie jednoznacznej nazwy rowversion, ponieważ timestamp może prowadzić do błędnej interpretacji przez programistów i narzędzia migracyjne.

Różnice typów podczas konwersji i porównywania

Zmiana wersji SQL Server może ujawnić problemy wynikające nie z samej dostępności typu, lecz z konwersji, precyzji i reguł porównywania. Konwersja z datetime do datetime2 nie odzyska dokładności utraconej podczas wcześniejszego zapisu. Z kolei konwersja wartości z większą precyzją do starszego typu może zaokrąglić albo obciąć część ułamkową sekundy. Przy migracji danych należy porównać wartości przed i po konwersji, zwłaszcza gdy są używane w warunkach zakresowych, sortowaniu, synchronizacji lub identyfikowaniu ostatniej zmiany.

Znaczenie ma również długość i typ tekstu. varchar służy do danych znakowych przechowywanych w kodowaniu strony kodowej kolumny, natomiast nvarchar przeznaczono dla danych Unicode. Literał znakowy bez prefiksu N może zostać potraktowany jako wartość nieunikodowa; dla tekstu Unicode używa się zapisu takiego jak N'Łódź'. Konwersje między varchar i nvarchar mogą prowadzić do utraty znaków, jeżeli strona kodowa nie reprezentuje całego tekstu. Trzeba też sprawdzić długości parametrów, ponieważ niejawne konwersje w predykatach mogą zmieniać plan wykonania i zwiększać koszt odczytu.

Podczas przejścia na nowszą wersję warto sprawdzić także ustawienia poziomu zgodności bazy danych. Poziom zgodności nie zmienia definicji wszystkich typów, ale wpływa na zachowanie części składni, optymalizatora i funkcji języka T-SQL. Bezpośrednią kontrolę schematu można rozpocząć od zapytań do widoków katalogowych, na przykład sys.columns, sys.types i sys.objects. Pozwala to wykryć kolumny używające typów przestarzałych, a następnie przeanalizować zależności przed wykonaniem ALTER TABLE.

Bezpieczna weryfikacja schematu przed migracją

Przed zmianą wersji SQL Server należy sporządzić listę kolumn, parametrów, zmiennych i wyników funkcji, które korzystają z typów zależnych od historii silnika. W praktyce trzeba objąć kontrolą nie tylko tabele, ale także procedury składowane, funkcje, widoki, indeksy, klucze, ograniczenia i definicje aplikacji przechowywane poza bazą. Wyszukiwanie samych nazw typów w skryptach może nie wykryć typów odziedziczonych przez aliasy, typy użytkownika albo narzędzia generujące schemat automatycznie.

Każdą konwersję należy wykonać na kopii bazy lub środowisku testowym z reprezentatywnymi danymi. Należy porównać liczbę wierszy, wartości graniczne, wartości NULL, długości tekstów, dane binarne oraz wyniki kluczowych zapytań. Dla kolumn daty i czasu trzeba sprawdzić wartości z końca dnia, ułamki sekund i przesunięcia zapisane w datetimeoffset. Dla tekstu trzeba przetestować znaki diakrytyczne i Unicode. Po zmianie należy ponownie utworzyć lub zweryfikować indeksy oraz przejrzeć plan zapytań, ponieważ zmiana typu może wpływać na rozmiar danych, konwersje niejawne i wybór operatorów przez optymalizator.

W środowisku SQL Server diagnostyka problemu po migracji powinna zaczynać się od identyfikacji konkretnego typu, wersji silnika, poziomu zgodności i miejsca wystąpienia konwersji. Komunikat o niezgodności nie zawsze oznacza uszkodzenie danych; może wskazywać na nieobsługiwaną składnię, niejawne rzutowanie albo różnicę między typem kolumny a typem parametru. W przypadku komputerów używanych do pracy z bazą ważne jest również sprawdzenie sterownika i biblioteki klienta, ponieważ aplikacja może mapować typy SQL Server na niewłaściwe typy języka programowania. Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnostyką podzespołów wykorzystywanych do pracy z oprogramowaniem bazodanowym.

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