TL;DR
TEXT
- vaste maximale grootte van 65535 tekens (je kunt de maximale grootte niet beperken)
- duurt 2 +
c
bytes schijfruimte, waarbijc
is de lengte van de opgeslagen string. - kan niet (volledig) deel uitmaken van een index. Men zou een prefixlengte moeten specificeren.
VARCHAR(M)
- variabele maximale grootte van
M
tekens M
moet tussen 1 en 65535 liggen- duurt 1 +
c
bytes (voorM
≤ 255) of 2 +c
(voor 256 ≤M
≤ 65535) bytes schijfruimte waarc
is de lengte van de opgeslagen string - kan deel uitmaken van een index
Meer details
TEXT
heeft een vaste maximale grootte van 2¹⁶-1 = 65535
tekens.VARCHAR
heeft een variabele maximale maat M
tot M = 2¹⁶-1
.
Je kunt dus niet de grootte van TEXT
kiezen maar dat kan voor een VARCHAR
.
Het andere verschil is dat je geen index (behalve een fulltext index) op een TEXT
kunt zetten kolom.
Dus als u een index op de kolom wilt hebben, moet u VARCHAR
gebruiken . Maar merk op dat de lengte van een index ook beperkt is, dus als uw VARCHAR
kolom is te lang, u hoeft alleen de eerste paar tekens van de VARCHAR
. te gebruiken kolom in uw index (zie de documentatie voor CREATE INDEX
).
Maar u wilt ook VARCHAR
. gebruiken , als u weet dat de maximale lengte van de mogelijke invoerreeks slechts M
. is , bijv. een telefoonnummer of een naam of iets dergelijks. Dan kunt u VARCHAR(30)
. gebruiken in plaats van TINYTEXT
of TEXT
en als iemand probeert de tekst van alle drie de "Lord of the Ring"-boeken op te slaan in je telefoonnummerkolom, sla je alleen de eerste 30 tekens op :)
Bewerken: Als de tekst die u in de database wilt opslaan langer is dan 65535 tekens, moet u MEDIUMTEXT
kiezen of LONGTEXT
, maar wees voorzichtig:MEDIUMTEXT
slaat strings op tot 16 MB, LONGTEXT
tot 4GB. Als u LONGTEXT
gebruikt en verkrijg de gegevens via PHP (tenminste als je mysqli
gebruikt) zonder store_result
), krijg je misschien een geheugentoewijzingsfout, omdat PHP 4 GB geheugen probeert toe te wijzen om er zeker van te zijn dat de hele string kan worden gebufferd. Dit gebeurt misschien ook in andere talen dan PHP.
U moet echter altijd controleer de invoer (Is het te lang? Bevat het vreemde code?) voor opslaan in de database.
Opmerking:voor beide typen hangt de benodigde schijfruimte alleen af van de lengte van de opgeslagen string en niet van de maximale lengte.
Bijvoorbeeld als u de tekenset latin1 gebruikt en de tekst "Test" opslaat in VARCHAR(30)
, VARCHAR(100)
en TINYTEXT
, het vereist altijd 5 bytes (1 byte om de lengte van de string op te slaan en 1 byte voor elk teken). Als u dezelfde tekst opslaat in een VARCHAR(2000)
of een TEXT
kolom, zou het ook dezelfde ruimte nodig hebben, maar in dit geval zou het 6 bytes zijn (2 bytes om de stringlengte op te slaan en 1 byte voor elk teken).
Bekijk voor meer informatie de documentatie .
Tot slot wil ik een opmerking toevoegen dat beide, TEXT
en VARCHAR
zijn gegevenstypen met variabele lengte en daarom minimaliseren ze hoogstwaarschijnlijk de ruimte die u nodig hebt om de gegevens op te slaan. Maar dit komt met een afweging voor prestaties. Als je betere prestaties nodig hebt, moet je een type met vaste lengte gebruiken, zoals CHAR
. U kunt hier
meer lezen over deze .