To zcela závisí na použitém enginu DBMS. SQL sám o sobě nenařizuje, jak jsou věci fyzicky uloženy, ale jak jsou logicky vidět.
Váš DBMS může například alokovat místo v řádku pro maximální velikost plus nějaké bajty navíc pro uložení délky. V takovém případě by byl velký rozdíl mezi varchar(10)
a varchar(1000)
protože byste ztratili dost místa na řádek.
Alternativně může použít zásobník vyrovnávací paměti pro varchar
data a do řádku ukládat pouze délku a "počáteční adresu" fondu vyrovnávacích pamětí. V takovém případě by každý jednotlivý řádek uložil informace o stejné velikosti pro varchar
sloupec bez ohledu na jeho velikost, ale byl by přidán krok k extrahování skutečných dat v tomto sloupci (po odkazu na fond vyrovnávacích pamětí).
Důvod, proč používáte varchar
přesně proto se jmenuje varchar
. Umožňuje ukládat datové prvky proměnné velikosti. Obvykle char(10)
vám dá deset znaků, bez ohledu na to, vyplnění mezerami, pokud vložíte něco kratšího. Při extrakci můžete oříznout koncové mezery, ale to nebude fungovat tak dobře, pokud data, která chcete uložit, jsou ve skutečnosti "hello "
, s koncovou mezeru, kterou chcete zachovat.
Slušný DBMS engine se může rozhodnout udělat kompromis v závislosti na maximální velikosti varchar
sloupec. U krátkých by to mohlo jen uložit do řádku a spotřebovat další bajty pro velikost.
Delší varchar
sloupce by mohly být „outsourcovány“ do samostatného fondu vyrovnávacích pamětí, aby bylo zajištěno efektivní čtení řádků (alespoň dokud nepotřebujete velký varchar
stejně).
Co musíte udělat, je znovu položit otázku pro váš konkrétní DBMS, abyste získali cílenější odpověď.
Nebo ve vší upřímnosti navrhněte svou databázi tak, aby ukládala pouze maximální velikost. Pokud víte, že je to 10, pak varchar(1000)
je odpad. Pokud v budoucnu budete potřebovat sloupec zvětšit, to je čas to udělat, spíše než nyní (viz YAGNI
).
Pro MySQL se budete chtít podívat na Chapter 14 Storage Engines
online dokumentace.
Pokrývá různé moduly úložiště (jako InnoDB a MyISAM), které MySQL používá, a když se podíváte dostatečně hluboko, můžete vidět, jak jsou informace fyzicky uloženy.
Například v MyISAM přítomnost dat proměnné délky v tabulce (varchar
zahrnuto) obvykle znamená dynamické tabulky
. Toto se řídí schématem, které je zhruba analogické s konceptem zásobníku vyrovnávacích pamětí, o kterém jsem se zmínil výše, s výhodou, že se pro sloupce s proměnnou velikostí plýtvá méně místem, a nevýhodou, že se řádky mohou fragmentovat.
Další formát úložiště (s komprimovaným formátem se slevou, protože se skutečně používá pouze pro tabulky pouze pro čtení) je statický , kde jsou data uložena v jediném fyzickém řádku.
Informace o fyzických strukturách InnoDB lze nalézt zde . V závislosti na tom, zda používáte formát souboru Antelope nebo Barracuda, skončíte se situací „všechny informace jsou fyzickým řádkem“ nebo „buffer pool“, podobně jako v MyISAM rozlišení mezi dynamickým a statickým.