In opslag, VARCHAR(255)
is slim genoeg om alleen de lengte op te slaan die je nodig hebt op een bepaalde rij, in tegenstelling tot CHAR(255)
die altijd 255 tekens zou bevatten.
Maar aangezien je deze vraag hebt getagd met MySQL, noem ik een MySQL-specifieke tip:aangezien rijen worden gekopieerd van de storage-engine-laag naar de SQL-laag, VARCHAR
velden worden geconverteerd naar CHAR
om het voordeel te krijgen van het werken met rijen met vaste breedte. Dus de strings in het geheugen worden opgevuld tot de maximale lengte van uw gedeclareerde VARCHAR
kolom.
Wanneer uw zoekopdracht impliciet een tijdelijke tabel genereert, bijvoorbeeld tijdens het sorteren of GROUP BY
, dit kan veel geheugen gebruiken. Als u veel VARCHAR(255)
. gebruikt velden voor gegevens die niet zo lang hoeven te zijn, kan dit de tijdelijke tabel erg groot maken.
Misschien vind je het ook leuk om te weten dat dit "padding-out"-gedrag betekent dat een string die is gedeclareerd met de utf8-tekenset opvult tot drie bytes per teken, zelfs voor strings die je opslaat met single-byte-inhoud (bijv. ascii- of latin1-tekens). En op dezelfde manier zorgt de utf8mb4-tekenset ervoor dat de tekenreeks uitloopt tot vier bytes per teken in het geheugen.
Dus een VARCHAR(255)
in utf8 kost het opslaan van een korte string zoals "Geen mening" 11 bytes op schijf (tien tekens met een lagere tekenset, plus één byte voor de lengte), maar het kost 765 bytes in het geheugen, en dus in tijdelijke tabellen of gesorteerde resultaten.
Ik heb MySQL-gebruikers geholpen die onbewust vaak tijdelijke tabellen van 1,5 GB maakten en hun schijfruimte opvulden. Ze hadden veel VARCHAR(255)
kolommen die in de praktijk zeer korte strings opsloegen.
U kunt de kolom het beste definiëren op basis van het type gegevens dat u wilt opslaan. Het heeft voordelen om toepassingsgerelateerde beperkingen af te dwingen, zoals andere mensen al hebben gezegd. Maar het heeft de fysieke voordelen om de geheugenverspilling te voorkomen die ik hierboven heb beschreven.
Het is natuurlijk moeilijk om te weten wat het langste postadres is, daarom kiezen veel mensen voor een lange VARCHAR
dat is zeker langer dan welk adres dan ook. En 255 is gebruikelijk omdat het de maximale lengte is van een VARCHAR
waarvan de lengte kan worden gecodeerd met één byte. Het was ook de maximale VARCHAR
lengte in MySQL ouder dan 5.0.