sql >> Databáze >  >> RDS >> Mysql

Rozdíl mezi VARCHAR a TEXT v MySQL

TL;DR

TEXT

  • pevná maximální velikost 65535 znaků (maximální velikost nelze omezit)
  • trvá 2 + c bajtů místa na disku, kde c 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ů (pro M ≤ 255) nebo 2 + c (pro 256 ≤ M ≤ 65535) bajtů místa na disku, kde c je délka uloženého řetězce
  • může být součástí indexu

Další podrobnosti

TEXTpevnou maximální velikost 2¹⁶-1 = 65535 znaků.
VARCHARproměnnou maximální velikost M 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 .



  1. Jak odesílat e-maily ze serveru SQL (T-SQL)

  2. 6 problémových dotazů, které masivně zpomalují vaši databázi

  3. Export tabulky Oracle do listu Excelu

  4. Aktualizujte prohlášení s vnitřním spojením na Oracle