TL;DR
TEXT
- fast maks. størrelse på 65535 tegn (du kan ikke begrænse maks. størrelse)
- tager 2 +
c
bytes diskplads, hvorc
er længden af den lagrede streng. - kan ikke være (helt) en del af et indeks. Man skal angive en præfikslængde.
VARCHAR(M)
- variabel maks. størrelse på
M
tegn M
skal være mellem 1 og 65535- tager 1 +
c
bytes (forM
≤ 255) eller 2 +c
(for 256 ≤M
≤ 65535) bytes diskplads hvorc
er længden af den lagrede streng - kan være en del af et indeks
Flere detaljer
TEXT
har en rettet maks. størrelse på 2¹⁶-1 = 65535
tegn.VARCHAR
har en variabel maks. størrelse M
op til M = 2¹⁶-1
.
Så du kan ikke vælge størrelsen på TEXT
men du kan for en VARCHAR
.
Den anden forskel er, at du ikke kan sætte et indeks (undtagen et fuldtekstindeks) på en TEXT
kolonne.
Så hvis du vil have et indeks på kolonnen, skal du bruge VARCHAR
. Men bemærk, at længden af et indeks også er begrænset, så hvis din VARCHAR
kolonnen er for lang, du skal kun bruge de første par tegn i VARCHAR
kolonne i dit indeks (se dokumentationen for CREATE INDEX
).
Men du vil også bruge VARCHAR
, hvis du ved, at den maksimale længde af den mulige inputstreng kun er M
, for eksempel. et telefonnummer eller et navn eller sådan noget. Så kan du bruge VARCHAR(30)
i stedet for TINYTEXT
eller TEXT
og hvis nogen forsøger at gemme teksten fra alle tre "Ringens Herre"-bøger i din telefonnummerkolonne, gemmer du kun de første 30 tegn :)
Rediger: Hvis teksten du vil gemme i databasen er længere end 65535 tegn, skal du vælge MEDIUMTEXT
eller LONGTEXT
, men vær forsigtig:MEDIUMTEXT
gemmer strenge op til 16 MB, LONGTEXT
op til 4 GB. Hvis du bruger LONGTEXT
og få dataene via PHP (i hvert fald hvis du bruger mysqli
uden store_result
), får du måske en hukommelsesallokeringsfejl, fordi PHP forsøger at allokere 4 GB hukommelse for at være sikker på, at hele strengen kan bufres. Dette sker måske også på andre sprog end PHP.
Du bør dog altid tjek inputtet (er det for langt? Indeholder det mærkelig kode?) før gemmer det i databasen.
Bemærk:For begge typer afhænger den nødvendige diskplads kun af længden af den lagrede streng og ikke af den maksimale længde.
F.eks. hvis du bruger tegnsættet latin1 og gemmer teksten "Test" i VARCHAR(30)
, VARCHAR(100)
og TINYTEXT
, kræver det altid 5 byte (1 byte til at gemme længden af strengen og 1 byte for hvert tegn). Hvis du gemmer den samme tekst i en VARCHAR(2000)
eller en TEXT
kolonne, ville den også kræve den samme plads, men i dette tilfælde ville den være 6 bytes (2 bytes til at gemme strengens længde og 1 byte for hvert tegn).
For mere information se dokumentationen .
Til sidst vil jeg tilføje en meddelelse om, at begge, TEXT
og VARCHAR
er datatyper med variabel længde, og derfor minimerer de højst sandsynligt den plads, du har brug for til at gemme dataene. Men dette kommer med en afvejning for ydeevne. Hvis du har brug for bedre ydeevne, skal du bruge en type med fast længde som CHAR
. Du kan læse mere om dette her
.