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.