| Termin | Definicja |
|---|---|
| TEXT | TEXT to przestarzały typ danych dla długich tekstów, zastępowany przez VARCHAR(MAX). Typ dziedziczony po erze ograniczonych stron danychTEXT wraz z rodzeństwem NTEXT i IMAGE powstał w SQL Server po to, żeby obejść limit strony danych wynoszący 8060 bajtów na wiersz. Wartość nie leżała w wierszu, tylko w osobnych stronach typu LOB, a w samym wierszu zapisywany był 16-bajtowy wskaźnik. TEXT przechowywał znaki jednobajtowe do około dwóch miliardów bajtów, NTEXT znaki dwubajtowe Unicode, więc mieścił o połowę mniej znaków. Microsoft oznaczył całą trójkę jako przestarzałą i zapowiedział usunięcie w przyszłych wydaniach, wskazując zamienniki: VARCHAR(MAX), NVARCHAR(MAX) i VARBINARY(MAX). Nowe typy zachowują się zewnętrznie jak zwykłe kolumny znakowe, a decyzję o trzymaniu danych w wierszu albo poza nim silnik podejmuje sam, zależnie od rozmiaru wartości. Dlaczego zamiennik jest wygodniejszy w pracyPodstawowa różnica jest w tym, co wolno z kolumną zrobić. Kolumny TEXT nie da się porównać operatorem równości ani użyć w GROUP BY, DISTINCT czy klauzuli ORDER BY. Nie zadziała na niej zwykłe podstawienie funkcją REPLACE bez wcześniejszej konwersji, a modyfikacja fragmentu wymagała archaicznych instrukcji WRITETEXT, READTEXT i UPDATETEXT operujących na wskaźniku tekstu. VARCHAR(MAX) obsługuje wszystkie standardowe funkcje łańcuchowe, konkatenację, a częściową modyfikację realizuje klauzulą .WRITE w instrukcji UPDATE, co przy dużych wartościach jest znacznie tańsze niż podmiana całości. Kolumna typu MAX może też brać udział w indeksie pełnotekstowym i daje się bez problemu przekazać do parametru procedury składowanej, czego typ TEXT nie potrafił. Co boli przy migracji istniejącej bazyZmiana typu instrukcją ALTER TABLE ALTER COLUMN sama w sobie jest szybka, ale bywa blokowana przez indeksy, ograniczenia i widoki tworzone z klauzulą schemabinding — te trzeba najpierw usunąć i odtworzyć. Druga pułapka to milcząca utrata danych przy konwersji NTEXT na VARCHAR(MAX): polskie znaki diakrytyczne zamienią się w pytajniki, jeśli strona kodowa kolumny ich nie obejmuje, a operacja nie zgłosi błędu. Trzecia to kod aplikacji, który po zmianie typu może zwracać inne wyniki, bo porównanie łańcuchów zaczyna nagle działać tam, gdzie wcześniej rzucało błąd i było obchodzone konwersją. Czwarta sprawa dotyczy miejsca na dysku: po konwersji stare strony LOB nie zwalniają się od razu, potrzebna jest reorganizacja tabeli. Warto też sprawdzić opcję text in row, bo tabele ze starym ustawieniem zachowują się po migracji inaczej niż nowe. Modernizacja baz systemów handlowychBazy wleczone od lat przez kolejne aktualizacje programów magazynowych bywają pełne kolumn TEXT trzymających opisy pozycji, uwagi do dokumentów i treści wydruków. Problem ujawnia się dopiero przy próbie zbudowania raportu albo integracji ze sklepem internetowym, gdy proste zapytanie grupujące odmawia współpracy. Zajmujemy się wdrażaniem i serwisowaniem Subiekta, WAPRO i Comarch na SQL Server, więc przegląd schematu, przygotowanie skryptu migracji i test na kopii bazy przed dotknięciem produkcji to standardowy element takiej pracy. Kopię odtwarzamy na osobnej instancji, żeby firma pracowała bez przerwy, a właściwą zmianę wykonujemy nocą — działamy całą dobę, także w weekendy. |