BLOB

Typ kolumny przechowujący duże dane binarne, np. obrazy czy pliki. Przeciwieństwem dla tekstu jest typ CLOB.

BLOB (Binary Large Object) to typ kolumny w bazie danych, który przechowuje surowe dane binarne — obrazy, pliki PDF, audio, wideo, archiwa ZIP, czy cokolwiek, co da się zapisać jako ciąg bajtów. W odróżnieniu od VARCHAR czy INT, baza nie zagląda do środka BLOB-a i nie próbuje go interpretować jako tekst — to dla niej po prostu wiadro bajtów o (zwykle) sporym rozmiarze.

Jak to działa i do czego służy

Kiedy deklarujesz kolumnę jako BLOB, mówisz silnikowi bazy: „trzymaj te bajty 1:1 i nie kombinuj z kodowaniem znaków ani sortowaniem”. Dzięki temu plik wyjęty z bazy jest bit w bit taki sam jak ten, który wrzuciłeś. Bliźniaczym typem dla danych tekstowych jest CLOB (Character Large Object) — ten z kolei zna kodowanie znaków (collation) i nadaje się na długie teksty, np. treść artykułu.

Różne bazy mają własne warianty. MySQL/MariaDB oferują rodzinę TINYBLOB, BLOB, MEDIUMBLOB i LONGBLOB (do ~4 GB). PostgreSQL nie ma typu BLOB — używasz tam bytea albo mechanizmu Large Objects (lo). Oracle i DB2 mają natomiast klasyczne BLOB i CLOB.

Przykład z praktyki

Powiedzmy, że w MySQL chcesz trzymać miniatury awatarów. Tworzysz kolumnę:

CREATE TABLE avatars (user_id INT PRIMARY KEY, image LONGBLOB);

Zapis pliku z poziomu serwera bazy zrobisz przez INSERT INTO avatars VALUES (1, LOAD_FILE('/tmp/ala.png'));, a w aplikacji najczęściej wrzucasz bajty przez prepared statement (np. setBytes() w JDBC czy bindBlob w innych driverach), żeby nie pakować pliku w stringa SQL.

Częste błędy i mity

  • Wrzucanie wszystkiego do BLOB-a. Duże pliki w bazie puchną backupy, obciążają replikację i zżerają RAM przy zapytaniach. Częsta dobra praktyka: trzymaj plik na dysku/w S3, a w bazie tylko ścieżkę albo klucz.
  • Mylenie z CLOB. Tekst w BLOB-ie da się zapisać, ale stracisz collation i sortowanie po znakach — od tekstu jest TEXT/CLOB.
  • SELECT * po tabeli z BLOB-ami. Niechcący ciągniesz megabajty przez sieć przy każdym zapytaniu. Wybieraj kolumnę binarną tylko wtedy, gdy faktycznie jej potrzebujesz.

Pojęcia powiązane

CLOB, TEXT, bytea (PostgreSQL), LONGBLOB, typy danych SQL, BSON, Base64, object storage (S3).