Typy danych w MySQL 8: stało- i zmienno- znakowe oraz tekstowe

MySQL 8 dostarcza kilku podstawowych typów danych znakowych. Zaliczamy do nich: CHAR(n), VARCHAR(n), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Różnice możesz porównać w tabeli powyżej.

Do bardzo krótkich łańcuchów znakowych używamy najczęściej typu CHAR(n) lub VARCHAR(n). CHAR(n) deklarujemy podając maksymalną liczbę znaków, jaką możemy przechować w danej kolumnie. Jest to typ danych stało-znakowy. Oznacza to, że jeśli zadeklarujemy kolumnę jako CHAR(5), a wstawimy łańcuch znakowy ‚las’, to i tak ten łańcuch w bazie będzie posiadał 5 znaków, bo pozostałe puste 2 miejsca zostaną uzupełnione 2 spacjami. Natomiast podczas pobierania wartości z kolumny, spacje te są domyślnie usuwane. Zakres maksymalnej liczby znaków wynosi 0-255. Domyślnie jest to 1 znak, jeśli pominiemy w deklaracji parametr n.

Utworzymy tabelę o nazwie teksty z 1 kolumną name zadeklarowaną jako typ CHAR, a więc domyślnie zezwalającą na przechowywanie łańcucha znakowego maksymalnie 1 znakowego.

CREATE TABLE teksty(name CHAR );

Podczas próby wstawienia łańcucha znakowego Ala

INSERT INTO teksty VALUES( 'Ala' );

otrzymaliśmy informację, że tekst jest za długi i operacja nie została wykonana.

Spróbujmy więc wstawić jeden znak: a:

INSERT INTO teksty VALUES( 'a' );

Tym razem dane zostały wstawione:

Jak widzimy typ danych CHAR nie skróci przydługiego tekstu, który wstawiamy, ale wyrzuci błąd.

Podobnie wygląda to z typem VARCHAR(n). Tu jednak musimy zwrócić uwagę na fakt, że n to maksymalna liczba bajtów z przedziału 0-65535, a więc maksymalnie 16kB. Jest to spowodowane tym, że wstawiane mogą być znaki, które zajmują różną liczbę bajtów (o tym będzie w innym poście). Jest to typ zmienno-znakowy, co oznacza, że jeśli zadeklarujemy kolumnę jako VARCHAR(5), a wstawimy tekst krótszy np. ‚las’, to zostanie wstawionych tyle bajtów ile zajmuje ten tekst, nie będzie uzupełniania pozostałego miejsca spacjami. Często ten 1 bajt to 1 znak. Przejdźmy do utworzenia tabeli i wstawienia kilku wierszy.

CREATE TABLE teksty(name VARCHAR ( 4 ));
INSERT INTO teksty VALUES( 'las ');
INSERT INTO teksty VALUES( 'park' );

Jak widać dla ograniczenia do 4 bajtów, gdzie w tym przypadku jest to 1 bajt na znak, zarówno tekst z 3 jak i 4 znaków został wstawiony. A co jesli spróbujemy wstawić tekst puszcza, przekraczający maksymalną długość?

INSERT INTO teksty VALUES( 'puszcza' );

Rekord nie został wstawiony, zostaliśmy powiadomieni o zbyt długim łańcuchu znakowym.

Przejdziemy teraz do pozostałych typów danych znakowych. Każdy z tych typów ma ograniczenie maksymalnej liczby bajtów, ale podczas deklarowania nie podajemy żadnego ograniczenia, wynika ono tylko z zadeklarowanego typu danych. I tak TINYTEXT nie może  zajmować więcej niż 255 bajtów,  TEXT nie więcej niż 64 kilobajty, MEDIUMTEXT maksymalnie 16 megabajtów, a LONGTEXT do 4GB. Podczas próby wstawienia tekstu dłuższego niż dopuszcza zadeklarowany typ danych rekord nie zostanie wstawiony.

Jak łatwo zauważyć typy danych CHAR i VARCHAR służą do przechowywania krótkich łańcuchów znakowych, pozostałe do raczej do dłuższych tekstów np. treści artykułów. Maksymalne ograniczenie co do przechowywanych bajtów jest identyczne dla typu danych VARCHAR i TEXT, bo wynosi 64kB, a więc maksymalnie 65535. Różnica jednak polega na tym, że VARCHAR domyślnie przechowuje 1 znak i dopiero zadeklarowanie w postaci parametru zmieni tą liczbę na dowolną ustaloną z przedziału 0 – 65535.). W przypadku typu danych TEXT nie ustawiamy liczby maksymalnej bajtów, zawsze ona wynosi 65535. Przykłady definicji kolumn przechowujących taką samą liczbę bajtów dla tekstu:
col TEXT ,
col2 VARCHAR(65535)
Poza tym, typ VARCHAR to standard SQL, a typy TEXT są rozszerzeniami dla MySQL. Typy CHAR czy VARCHAR mogą mieć przypisaną na kolumnie wartość domyślną, a typy TEXT nie mogą, z wyjątkiem NULL. Podobnie wygląda różnica między typem CHAR a typem TINYTEXT, tu jednak CHAR jest dodatkowo stało-znakowy i może zajmować w bazie więcej miejsca niż długość znaków wprowadzonego tekstu.

Jeśli możesz użyć standardowy typ CHAR czy VARCHAR użyj tych typów zamiast TEXT.