Når vi oppretter en tabell i mysql med en VARCHAR
-kolonne, må vi angi lengden på den. Men for TEXT
-typen trenger vi ikke å angi lengden.
Hva er forskjellen mellom VARCHAR
og TEXT
?
TEXT
TEXT
c
byte diskplass, der c
er lengden på den lagrede strengen.VARCHAR(M)
M
tegnM
må være mellom 1 og 65535c
byte (for M
≤ 255) eller 2 + c
(for 256 ≤ M
≤ 65535) byte diskplass der c
er lengden på den lagrede strengenTEXT
har en fast maksimal størrelse på 2¹⁶-1 = 65535
tegn.
VARCHAR
har en variabel maks størrelse M
opp til M = 2¹⁶-1
.
Du kan altså ikke velge størrelsen på TEXT
, men det kan du for VARCHAR
.
Den andre forskjellen er at du ikke kan legge en indeks (bortsett fra en fulltekstindeks) på en TEXT
-kolonne.
Så hvis du vil ha en indeks på kolonnen, må du bruke VARCHAR
. Men legg merke til at lengden på en indeks også er begrenset, så hvis VARCHAR
-kolonnen er for lang, må du bare bruke de første tegnene i VARCHAR
-kolonnen i indeksen (se dokumentasjonen for CREATE INDEX
).
Men du kan også bruke VARCHAR
hvis du vet at den maksimale lengden på den mulige inndatastrengen bare er M
, f.eks. et telefonnummer eller et navn eller noe slikt. Da kan du bruke VARCHAR(30)
i stedet for TINYTEXT
eller TEXT
, og hvis noen prøver å lagre teksten til alle tre "Ringenes Herre"-bøkene i telefonnummerkolonnen, lagrer du bare de første 30 tegnene :)
Edit: Hvis teksten du vil lagre i databasen er lengre enn 65535 tegn, må du velge MEDIUMTEXT
eller LONGTEXT
, men vær forsiktig: MEDIUMTEXT
lagrer strenger opp til 16 MB, LONGTEXT
opp til 4 GB. Hvis du bruker LONGTEXT
og henter dataene via PHP (i hvert fall hvis du bruker mysqli
uten store_result
), kan du få en minneallokeringsfeil, fordi PHP prøver å allokere 4 GB minne for å være sikker på at hele strengen kan bufres. Dette kan også skje i andre språk enn PHP.
Du bør imidlertid alltid sjekke inndataene (er de for lange? Inneholder de merkelig kode?) før du lagrer dem i databasen.
Legg merke til dette: For begge typer avhenger den nødvendige diskplassen bare av lengden på den lagrede strengen og ikke av maksimumslengden.
*Hvis du f.eks. bruker tegnsettet latin1 og lagrer teksten "Test" i VARCHAR(30)
, VARCHAR(100)
og TINYTEXT
, kreves det alltid 5 byte (1 byte for å lagre lengden på strengen og 1 byte for hvert tegn). Hvis du lagrer den samme teksten i en VARCHAR(2000)
eller en TEXT
-kolonne, vil den også kreve samme plass, men i dette tilfellet vil det være 6 byte (2 byte for å lagre strengelengden og 1 byte for hvert tegn).
Du finner mer informasjon i dokumentasjonen.
Til slutt vil jeg legge til en merknad om at både TEXT
og VARCHAR
er datatyper med variabel lengde, slik at de sannsynligvis minimerer plassen du trenger for å lagre dataene. Men dette har en ulempe for ytelsen. Hvis du trenger bedre ytelse, må du bruke en type med fast lengde som CHAR
. Du kan lese mer om dette her.