TL;DR
TEXT
- pevná maximální velikost 65535 znaků (maximální velikost nelze omezit)
- trvá 2 +
cbajtů místa na disku, kdecje 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
Mznaky Mmusí být mezi 1 a 65535- trvá 1 +
cbajtů (proM≤ 255) nebo 2 +c(pro 256 ≤M≤ 65535) bajtů místa na disku, kdecje 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
.