VARBINARY(MAX) przechowuje do 2 GB danych binarnych — dla większych obiektów właściwszy jest FILESTREAM.
VARBINARY(MAX) jako typ danych w SQL Server
VARBINARY(MAX) jest typem danych programu Microsoft SQL Server przeznaczonym do przechowywania wartości binarnych o zmiennej długości. Wartość nie jest interpretowana przez silnik jako tekst ani jako liczba, dlatego może zawierać między innymi zawartość pliku, fragment obrazu, dokument PDF, skompresowany blok danych albo wynik szyfrowania. Typ przechowuje bajty w niezmienionej postaci; znaczenie tych bajtów wynika z aplikacji, która je zapisała i później odczytuje.
Maksymalna długość pojedynczej wartości VARBINARY(MAX) wynosi 231−1 bajtów, czyli 2 147 483 647 bajtów. Jest to wartość zbliżona do 2 GB, ale technicznie nie oznacza dokładnie dwóch gigabajtów. Przy deklaracji kolumny bez określenia długości używa się właśnie wariantu MAX, na przykład plik VARBINARY(MAX). W odróżnieniu od VARBINARY(n), gdzie n może wynosić maksymalnie 8000 bajtów, wariant MAX obsługuje znacznie większe obiekty binarne.
Rozmiar wartości a sposób przechowywania
SQL Server może przechowywać dane typu VARBINARY(MAX) bezpośrednio w wierszu albo poza podstawową strukturą wiersza. Sposób zależy między innymi od rozmiaru wartości i ustawienia large value types out of row. Dla dużych wartości wiersz może zawierać wskaźnik do danych zapisanych poza główną częścią wiersza. Nie należy więc zakładać, że każda wartość VARBINARY(MAX) zajmuje w tabeli zawsze ten sam układ fizyczny.
Rozmiar rzeczywiście zajęty przez wartość można sprawdzić funkcją DATALENGTH, która zwraca liczbę bajtów. Jest ona właściwa dla danych binarnych, ponieważ nie przelicza zawartości według znaków ani stron kodowych. Przykładowe zapytanie SELECT DATALENGTH(plik) FROM dbo.Dokumenty; pozwala wykryć puste wartości, nietypowo duże rekordy oraz wzrost zajętości tabeli. Wartość NULL oznacza brak danych i jest czymś innym niż pusty ciąg binarny zapisany jako 0x.
Zapisywanie, odczyt i kontrola danych binarnych
Dane do kolumny VARBINARY(MAX) można wstawiać z użyciem literałów binarnych, takich jak 0xFFD8FFE0, albo przekazywać jako parametr z aplikacji korzystającej z klienta SQL Server. Parametryzacja pozwala uniknąć błędów związanych z ręcznym składaniem instrukcji i nie wymaga zamiany całego pliku na tekst szesnastkowy. Przy konwersjach należy jawnie określać typ docelowy, na przykład użyć CONVERT(VARBINARY(MAX), wyrażenie), ponieważ konwersja tekstu i bajtów może dawać różne wyniki zależnie od zastosowanego typu oraz stylu konwersji.
SQL Server udostępnia operacje przydatne przy obsłudze fragmentów danych binarnych. Funkcja SUBSTRING może pobrać część wartości, a LEFT i RIGHT mogą ograniczyć wynik do wybranej liczby bajtów. Do porównywania lub kontroli integralności można wykorzystać funkcje skrótu, takie jak HASHBYTES, z algorytmami obsługiwanymi przez daną wersję SQL Server; w nowych wdrożeniach nie powinno się wybierać przestarzałego MD2, MD4 ani MD5 do celów wymagających odporności kryptograficznej. Sam typ VARBINARY(MAX) nie zapewnia jednak walidacji formatu pliku, wykrywania wirusów ani sprawdzenia, czy zapisane bajty tworzą poprawny dokument.
Granica zastosowania VARBINARY(MAX) i FILESTREAM
Dla plików przechowywanych bezpośrednio w bazie VARBINARY(MAX) upraszcza model danych: metadane i zawartość mogą znajdować się w jednym rekordzie, a operacje zapisu są objęte transakcjami SQL Server. Przy dużych obiektach rosną jednak wymagania dotyczące kopii zapasowych, odczytu, miejsca na pliki danych i czasu wykonywania operacji. Jeżeli aplikacja często przesyła duże pliki albo musi obsługiwać obiekty większe niż limit VARBINARY(MAX), SQL Server oferuje FILESTREAM. FILESTREAM zapisuje zawartość binarną w systemie plików NTFS, jednocześnie utrzymując transakcyjną kontrolę i powiązanie z rekordem bazy.
FILESTREAM nie jest automatyczną właściwością każdej kolumny VARBINARY(MAX). Wymaga skonfigurowania FILESTREAM na poziomie instancji, grupy plików FILESTREAM oraz kolumny zadeklarowanej z atrybutem FILESTREAM. Przykładowo kolumna może mieć definicję VARBINARY(MAX) FILESTREAM NOT NULL, a tabela musi zawierać wymagany przez ten mechanizm unikatowy identyfikator wiersza. Do dostępu transakcyjnego przez system plików służy interfejs OpenSqlFilestream, który współpracuje z transakcją SQL Server. Wybór między zwykłym VARBINARY(MAX) a FILESTREAM powinien wynikać z rozmiaru obiektów, częstotliwości transferu, modelu kopii zapasowych i sposobu użycia plików przez aplikację.