MySQL biedt een keuze aan storage-engines. De fysieke opslag van gegevens is afhankelijk van de opslagengine.
MijnISAM-opslag van VARCHAR
In MijnISAM, VARCHAR
s bezetten meestal alleen de werkelijke lengte van de string plus een byte of twee lengte. Dit wordt praktisch gemaakt door de ontwerpbeperking van MyISAM tot tafelvergrendeling in plaats van rijvergrendeling. De gevolgen voor de prestaties zijn onder meer een compacter cacheprofiel, maar ook een meer gecompliceerde (langzamere) berekening van record-offsets.
De fysieke opslagmethode is vooral belangrijk bij indexen, wat een ander verhaal is dan tabellen. MyISAM gebruikt ruimtecompressie voor beide CHAR
en VARCHAR
kolommen, wat betekent dat kortere gegevens in beide gevallen minder ruimte innemen in de index.
InnoDB-opslag van VARCHAR
InnoDB gebruikt, net als de meeste andere huidige relationele databases, een meer geavanceerd mechanisme. VARCHAR
kolommen met een maximale breedte van minder dan 768 bytes worden inline opgeslagen, waarbij de gereserveerde ruimte overeenkomt met die maximale breedte. Nauwkeuriger hier
:
InnoDB doet momenteel geen ruimtecompressie in zijn indexen, het tegenovergestelde van MyISAM zoals hierboven beschreven.
Terug naar de vraag
Al het bovenstaande is echter slechts een implementatiedetail dat zelfs tussen versies kan veranderen. Het echte verschil tussen CHAR
en VARCHAR
is semantisch, en dat geldt ook voor die tussen VARCHAR(20)
en VARCHAR(50)
. Door ervoor te zorgen dat er geen manier is om een reeks van 30 tekens op te slaan in een VARCHAR(20)
, maakt de database het leven gemakkelijker en beter gedefinieerd voor verschillende processors en applicaties die het zogenaamd integreert in een voorspelbaar gedragende oplossing. Dit is het belangrijkste.
Met betrekking tot persoonlijke namen specifiek, deze vraag kan je wat praktische handvatten geven. Mensen met volledige namen van meer dan 70 UTF-8-tekens hebben sowieso problemen.