Dette afhænger helt af den anvendte DBMS-motor. SQL selv giver ikke mandat til, hvordan ting opbevares fysisk, bare hvordan de ses logisk.
For eksempel kan dit DBMS allokere plads i rækken til den maksimale størrelse, plus nogle ekstra bytes til at gemme længden. I så fald ville der være en stor forskel mellem varchar(10)
og varchar(1000)
da du ville spilde en del plads pr. række.
Alternativt kan den bruge en bufferpulje til varchar
data og gem kun længden og bufferpuljens "startadresse" i rækken. I så fald vil hver enkelt række gemme information af identisk størrelse for en varchar
kolonne uanset størrelsen, men der ville være et ekstra trin til at udtrække de faktiske data i den kolonne (ved at følge linket til bufferpuljen).
Grunden til at du bruger en varchar
er netop derfor, den hedder varchar
. Det giver dig mulighed for at gemme dataelementer i variabel størrelse. Typisk char(10)
giver dig ti tegn, uanset hvad, udfylder det med mellemrum, hvis du indsætter noget kortere. Du kan trimme efterfølgende mellemrum af, mens du udpakker det, men det vil ikke fungere så godt, hvis de data, du vil gemme, faktisk er "hello "
, med et efterfølgende rum, du ønsker bevaret.
En anstændig DBMS-motor kan beslutte at foretage en afvejning afhængigt af den maksimale størrelse af varchar
kolonne. For korte, kunne den bare gemme den inline i rækken og forbruge de ekstra bytes til størrelsen.
Længere varchar
kolonner kunne "outsources" til en separat bufferpulje for at sikre, at rækkelæsning holdes effektiv (i det mindste indtil du bruger den store varchar
kolonne alligevel).
Det du skal gøre er at stille spørgsmålet igen til din specifikke DBMS for at få et mere målrettet svar.
Eller helt ærligt, konstruer din database til kun at gemme den maksimale størrelse. Hvis du ved, at det er 10, så varchar(1000)
er spild. Hvis du i fremtiden skal forstørre kolonnen, det er det tid til at gøre det i stedet for nu (se YAGNI
).
For MySQL skal du se på Chapter 14 Storage Engines
af onlinedokumentationen.
Den dækker de forskellige lagringsmotorer (såsom InnoDB og MyISAM), som MySQL bruger, og ser du dybt nok kan du se, hvordan informationen fysisk lagres.
For eksempel, i MyISAM, tilstedeværelsen af data med variabel længde i en tabel (varchar
inkluderet) betyder normalt dynamiske tabeller
. Dette følger et skema, der er nogenlunde analogt med bufferpuljekonceptet, jeg nævnte ovenfor, med den fordel, at der spildes mindre plads til kolonner af varierende størrelse, og den ulempe, at rækker kan blive fragmenterede.
Det andet lagringsformat (med rabat på komprimeret format, da det egentlig kun bruges til skrivebeskyttede tabeller) er statisk en , hvor data gemmes i en enkelt fysisk række.
Oplysninger om InnoDB fysiske strukturer kan findes her . Afhængigt af om du bruger Antelope- eller Barracuda-filformatet, ender du med situationen "al information er en fysisk række" eller "bufferpulje", svarende til MyISAM-forskellen mellem dynamisk og statisk.