sql >> Databasteknik >  >> RDS >> Mysql

Skillnaden mellan VARCHAR och TEXT i MySQL

TL;DR

TEXT

  • fast maxstorlek på 65535 tecken (du kan inte begränsa maxstorleken)
  • tar 2 + c byte med diskutrymme, där c är längden på den lagrade strängen.
  • kan inte vara (helt) en del av ett index. Man skulle behöva ange en prefixlängd.

VARCHAR(M)

  • variabel maxstorlek på M tecken
  • M måste vara mellan 1 och 65535
  • tar 1 + c byte (för M ≤ 255) eller 2 + c (för 256 ≤ M ≤ 65535) byte diskutrymme där c är längden på den lagrade strängen
  • kan vara en del av ett index

Mer information

TEXT har en fixad maxstorlek på 2¹⁶-1 = 65535 tecken.
VARCHAR har en variabel maxstorlek M upp till M = 2¹⁶-1 .
Du kan alltså inte välja storleken på TEXT men du kan för en VARCHAR .

Den andra skillnaden är att du inte kan lägga ett index (förutom ett fulltextindex) på en TEXT kolumn.
Så om du vill ha ett index på kolumnen måste du använda VARCHAR . Men lägg märke till att längden på ett index också är begränsad, så om din VARCHAR kolumnen är för lång måste du bara använda de första tecknen i VARCHAR kolumn i ditt index (se dokumentationen för CREATE INDEX ).

Men du vill också använda VARCHAR , om du vet att den maximala längden på den möjliga inmatningssträngen endast är M , t.ex. ett telefonnummer eller ett namn eller något liknande. Sedan kan du använda VARCHAR(30) istället för TINYTEXT eller TEXT och om någon försöker spara texten i alla tre "Ringens Herre"-böcker i din telefonnummerkolumn lagrar du bara de första 30 tecknen :)

Redigera: Om texten du vill lagra i databasen är längre än 65535 tecken, måste du välja MEDIUMTEXT eller LONGTEXT , men var försiktig:MEDIUMTEXT lagrar strängar upp till 16 MB, LONGTEXT upp till 4 GB. Om du använder LONGTEXT och hämta data via PHP (åtminstone om du använder mysqli utan store_result ), kanske du får ett minnesallokeringsfel, eftersom PHP försöker allokera 4 GB minne för att vara säker på att hela strängen kan buffras. Detta kanske också händer på andra språk än PHP.

Du bör dock alltid kontrollera inmatningen (Är den för lång? Innehåller den konstig kod?) före lagra den i databasen.

Observera:För båda typerna beror det nödvändiga diskutrymmet endast på längden på den lagrade strängen och inte på den maximala längden.
T.ex. om du använder teckenuppsättningen latin1 och lagrar texten "Test" i VARCHAR(30) , VARCHAR(100) och TINYTEXT , det kräver alltid 5 byte (1 byte för att lagra längden på strängen och 1 byte för varje tecken). Om du lagrar samma text i en VARCHAR(2000) eller en TEXT kolumn, skulle det också kräva samma utrymme, men i det här fallet skulle det vara 6 byte (2 byte för att lagra stränglängden och 1 byte för varje tecken).

För mer information, ta en titt på dokumentationen .

Slutligen vill jag lägga till ett meddelande om att båda, TEXT och VARCHAR är datatyper med variabel längd, och därför minimerar de troligen det utrymme du behöver för att lagra data. Men detta kommer med en avvägning för prestanda. Om du behöver bättre prestanda måste du använda en typ med fast längd som CHAR . Du kan läsa mer om detta här .



  1. AWS RDS Säkerhetskopieringsmetoder

  2. Dela upp stora raderingsoperationer i bitar

  3. Tuning SQL

  4. Hur tar man bort dubbletter från kommaseparerad lista med regexp_replace i Oracle?