TL;DR
TEXT
- stały maksymalny rozmiar 65535 znaków (nie można ograniczyć maksymalnego rozmiaru)
- zajmuje 2 +
c
bajtów miejsca na dysku, gdziec
to długość przechowywanego ciągu. - nie może być (w pełni) częścią indeksu. Trzeba by określić długość prefiksu.
VARCHAR(M)
- zmienny maksymalny rozmiar
M
postacie M
musi wynosić od 1 do 65535- przyjmuje 1 +
c
bajty (dlaM
≤ 255) lub 2 +c
(dla 256 ≤M
≤ 65535) bajtów miejsca na dysku, gdziec
to długość przechowywanego ciągu - może być częścią indeksu
Więcej szczegółów
TEXT
ma stały maksymalny rozmiar 2¹⁶-1 = 65535
znaków.VARCHAR
ma zmienną maksymalny rozmiar M
do M = 2¹⁶-1
.
Więc nie możesz wybrać rozmiaru TEXT
ale możesz dla VARCHAR
.
Inna różnica polega na tym, że nie można umieścić indeksu (z wyjątkiem indeksu pełnotekstowego) na TEXT
kolumna.
Więc jeśli chcesz mieć indeks na kolumnie, musisz użyć VARCHAR
. Zauważ jednak, że długość indeksu jest również ograniczona, więc jeśli twój VARCHAR
kolumna jest za długa, musisz użyć tylko pierwszych kilku znaków VARCHAR
kolumna w indeksie (Zobacz dokumentację CREATE INDEX
).
Ale chcesz również użyć VARCHAR
, jeśli wiesz, że maksymalna długość możliwego ciągu wejściowego to tylko M
, np. numer telefonu, nazwisko lub coś w tym stylu. Następnie możesz użyć VARCHAR(30)
zamiast TINYTEXT
lub TEXT
a jeśli ktoś spróbuje zapisać tekst wszystkich trzech książek „Władca Pierścienia” w kolumnie numeru telefonu, zachowasz tylko pierwsze 30 znaków :)
Edytuj: Jeśli tekst, który chcesz przechowywać w bazie danych jest dłuższy niż 65535 znaków, musisz wybrać MEDIUMTEXT
lub LONGTEXT
, ale bądź ostrożny:MEDIUMTEXT
przechowuje ciągi do 16 MB, LONGTEXT
do 4 GB. Jeśli używasz LONGTEXT
i pobierz dane przez PHP (przynajmniej jeśli używasz mysqli
bez store_result
), może pojawić się błąd alokacji pamięci, ponieważ PHP próbuje przydzielić 4 GB pamięci, aby mieć pewność, że cały ciąg może być buforowany. Może się to również zdarzyć w innych językach niż PHP.
Jednak powinieneś zawsze sprawdź dane wejściowe (Czy jest za długie? Czy zawiera dziwny kod?) przed przechowywanie go w bazie danych.
Uwaga:w przypadku obu typów wymagane miejsce na dysku zależy tylko od długości przechowywanego ciągu, a nie od maksymalnej długości.
Np. jeśli używasz zestawu znaków latin1 i przechowujesz tekst "Test" w VARCHAR(30)
, VARCHAR(100)
i TINYTEXT
, zawsze wymaga 5 bajtów (1 bajt do przechowywania długości łańcucha i 1 bajt na każdy znak). Jeśli przechowujesz ten sam tekst w VARCHAR(2000)
lub TEXT
kolumny, wymagałoby to również tej samej przestrzeni, ale w tym przypadku byłoby to 6 bajtów (2 bajty do przechowywania długości łańcucha i 1 bajt na każdy znak).
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją .
Na koniec chcę dodać informację, że oba, TEXT
i VARCHAR
są typami danych o zmiennej długości, więc najprawdopodobniej minimalizują one przestrzeń potrzebną do przechowywania danych. Ale wiąże się to z kompromisem w stosunku do wydajności. Jeśli potrzebujesz lepszej wydajności, musisz użyć typu o stałej długości, takiego jak CHAR
. Więcej informacji o tym tutaj
.