TL;DR
TEXT
- pevná maximální velikost 65535 znaků (maximální velikost nelze omezit)
- trvá 2 +
c
bajtů místa na disku, kdec
je délka uloženého řetězce. - nemůže být (plně) součástí indexu. Bylo by potřeba zadat délku předpony.
VARCHAR(M)
- proměnná maximální velikost
M
znaky M
musí být mezi 1 a 65535- trvá 1 +
c
bajtů (proM
≤ 255) nebo 2 +c
(pro 256 ≤M
≤ 65535) bajtů místa na disku, kdec
je délka uloženého řetězce - může být součástí indexu
Další podrobnosti
TEXT
má pevnou maximální velikost 2¹⁶-1 = 65535
znaků.VARCHAR
má proměnnou maximální velikost M
až M = 2¹⁶-1
.
Nemůžete tedy zvolit velikost TEXT
ale můžete pro VARCHAR
.
Dalším rozdílem je, že nemůžete umístit index (kromě fulltextového indexu) na TEXT
sloupec.
Pokud tedy chcete mít na sloupci index, musíte použít VARCHAR
. Všimněte si však, že délka indexu je také omezena, takže pokud váš VARCHAR
sloupec je příliš dlouhý, musíte použít pouze prvních několik znaků z VARCHAR
sloupec ve vašem indexu (Viz dokumentaci pro CREATE INDEX
).
Ale také chcete použít VARCHAR
, pokud víte, že maximální délka možného vstupního řetězce je pouze M
, např. telefonní číslo nebo jméno nebo něco takového. Pak můžete použít VARCHAR(30)
místo TINYTEXT
nebo TEXT
a pokud se někdo pokusí uložit text všech tří knih "Pán prstenu" do sloupce vašeho telefonního čísla, uložíte pouze prvních 30 znaků :)
Upravit: Pokud je text, který chcete uložit do databáze, delší než 65535 znaků, musíte zvolit MEDIUMTEXT
nebo LONGTEXT
, ale buďte opatrní:MEDIUMTEXT
ukládá řetězce do 16 MB, LONGTEXT
až 4 GB. Pokud používáte LONGTEXT
a získat data přes PHP (alespoň pokud používáte mysqli
bez store_result
), možná dostanete chybu alokace paměti, protože PHP se snaží alokovat 4 GB paměti, aby se ujistil, že celý řetězec může být uložen do vyrovnávací paměti. To se možná děje i v jiných jazycích než PHP.
Měli byste však vždy zkontrolujte vstup (Je příliš dlouhý? Obsahuje podivný kód?) před uložením do databáze.
Upozornění:U obou typů závisí požadované místo na disku pouze na délce uloženého řetězce, nikoli na maximální délce.
Např. pokud použijete znakovou sadu latin1 a uložíte text "Test" do VARCHAR(30)
, VARCHAR(100)
a TINYTEXT
, vždy vyžaduje 5 bajtů (1 bajt pro uložení délky řetězce a 1 bajt pro každý znak). Pokud uložíte stejný text do VARCHAR(2000)
nebo TEXT
sloupec by také vyžadoval stejný prostor, ale v tomto případě by to bylo 6 bajtů (2 bajty pro uložení délky řetězce a 1 bajt pro každý znak).
Další informace naleznete v dokumentaci .
Nakonec chci přidat upozornění, že obojí, TEXT
a VARCHAR
jsou datové typy s proměnnou délkou, a proto s největší pravděpodobností minimalizují prostor, který potřebujete k uložení dat. Ale to přichází s kompromisem za výkon. Pokud potřebujete lepší výkon, musíte použít typ s pevnou délkou, jako je CHAR
. Více si o tomto můžete přečíst zde
.