TL;DR
TEXT
- fast maxstorlek på 65535 tecken (du kan inte begränsa maxstorleken)
- tar 2 +
c
byte med diskutrymme, därc
är längden på den lagrade strängen. - kan inte vara (helt) en del av ett index. Man skulle behöva ange en prefixlängd.
VARCHAR(M)
- variabel maxstorlek på
M
tecken M
måste vara mellan 1 och 65535- tar 1 +
c
byte (förM
≤ 255) eller 2 +c
(för 256 ≤M
≤ 65535) byte diskutrymme därc
är längden på den lagrade strängen - kan vara en del av ett index
Mer information
TEXT
har en fixad maxstorlek på 2¹⁶-1 = 65535
tecken.VARCHAR
har en variabel maxstorlek M
upp till M = 2¹⁶-1
.
Du kan alltså inte välja storleken på TEXT
men du kan för en VARCHAR
.
Den andra skillnaden är att du inte kan lägga ett index (förutom ett fulltextindex) på en TEXT
kolumn.
Så om du vill ha ett index på kolumnen måste du använda VARCHAR
. Men lägg märke till att längden på ett index också är begränsad, så om din VARCHAR
kolumnen är för lång måste du bara använda de första tecknen i VARCHAR
kolumn i ditt index (se dokumentationen för CREATE INDEX
).
Men du vill också använda VARCHAR
, om du vet att den maximala längden på den möjliga inmatningssträngen endast är M
, t.ex. ett telefonnummer eller ett namn eller något liknande. Sedan kan du använda VARCHAR(30)
istället för TINYTEXT
eller TEXT
och om någon försöker spara texten i alla tre "Ringens Herre"-böcker i din telefonnummerkolumn lagrar du bara de första 30 tecknen :)
Redigera: Om texten du vill lagra i databasen är längre än 65535 tecken, måste du välja MEDIUMTEXT
eller LONGTEXT
, men var försiktig:MEDIUMTEXT
lagrar strängar upp till 16 MB, LONGTEXT
upp till 4 GB. Om du använder LONGTEXT
och hämta data via PHP (åtminstone om du använder mysqli
utan store_result
), kanske du får ett minnesallokeringsfel, eftersom PHP försöker allokera 4 GB minne för att vara säker på att hela strängen kan buffras. Detta kanske också händer på andra språk än PHP.
Du bör dock alltid kontrollera inmatningen (Är den för lång? Innehåller den konstig kod?) före lagra den i databasen.
Observera:För båda typerna beror det nödvändiga diskutrymmet endast på längden på den lagrade strängen och inte på den maximala längden.
T.ex. om du använder teckenuppsättningen latin1 och lagrar texten "Test" i VARCHAR(30)
, VARCHAR(100)
och TINYTEXT
, det kräver alltid 5 byte (1 byte för att lagra längden på strängen och 1 byte för varje tecken). Om du lagrar samma text i en VARCHAR(2000)
eller en TEXT
kolumn, skulle det också kräva samma utrymme, men i det här fallet skulle det vara 6 byte (2 byte för att lagra stränglängden och 1 byte för varje tecken).
För mer information, ta en titt på dokumentationen .
Slutligen vill jag lägga till ett meddelande om att båda, TEXT
och VARCHAR
är datatyper med variabel längd, och därför minimerar de troligen det utrymme du behöver för att lagra data. Men detta kommer med en avvägning för prestanda. Om du behöver bättre prestanda måste du använda en typ med fast längd som CHAR
. Du kan läsa mer om detta här
.