MySQL erbjuder ett urval av lagringsmotorer. Den fysiska lagringen av data beror på lagringsmotorn.
MyISAM-lagring av VARCHAR
I MyISAM, VARCHAR
s upptar vanligtvis bara den faktiska längden på strängen plus en byte eller två av längden. Detta görs praktiskt genom designbegränsningen av MyISAM till bordslåsning i motsats till en radlåsningsfunktion. Prestandakonsekvenserna inkluderar en mer kompakt cacheprofil, men också mer komplicerad (långsammare) beräkning av postoffset.
(Faktum är att MyISAM ger dig en grad av valfrihet mellan fast fysisk radstorlek och variabel fysisk radstorlek tabellformat beroende på kolumntyper som förekommer i hela tabellen. Förekomst av VARCHAR
ändrar bara standardmetoden, men närvaron av en TEXT
blob krafter VARCHAR
s i samma tabell för att använda metoden med variabel längd också.)
Den fysiska lagringsmetoden är särskilt viktig med index, vilket är en annan historia än tabeller. MyISAM använder rymdkomprimering för båda CHAR
och VARCHAR
kolumner, vilket innebär att kortare data tar mindre plats i indexet i båda fallen.
InnoDB-lagring av VARCHAR
InnoDB, som de flesta andra nuvarande relationsdatabaser, använder en mer sofistikerad mekanism. VARCHAR
kolumner vars maximala bredd är mindre än 768 byte kommer att lagras inline, med reserverat rum som matchar den maximala bredden. Mer exakt här
:
InnoDB gör för närvarande inte rymdkomprimering i sina index, motsatsen till MyISAM som beskrivs ovan.
Tillbaka till frågan
Allt ovanstående är dock bara en implementeringsdetalj som till och med kan ändras mellan versionerna. Den verkliga skillnaden mellan CHAR
och VARCHAR
är semantisk, och så är den mellan VARCHAR(20)
och VARCHAR(50)
. Genom att säkerställa att det inte finns något sätt att lagra en sträng på 30 tecken i en VARCHAR(20)
, databasen gör livet enklare och bättre definierat för olika processorer och applikationer som den förmodligen integrerar i en förutsägbart fungerande lösning. Det här är den stora affären.
När det gäller personnamn specifikt, den här frågan kan ge dig lite praktisk vägledning. Personer med fullständiga namn över 70 UTF-8-tecken har problem ändå.