sql >> Databasteknik >  >> RDS >> Mysql

Finns det nackdelar med att använda en generisk varchar(255) för alla textbaserade fält?

I lagring, VARCHAR(255) är smart nog att bara lagra den längd du behöver på en given rad, till skillnad från CHAR(255) som alltid lagrar 255 tecken.

Men eftersom du taggade den här frågan med MySQL, ska jag nämna ett MySQL-specifikt tips:eftersom rader kopieras från lagringsmotorlagret till SQL-lagret, VARCHAR fält konverteras till CHAR för att få fördelen av att arbeta med rader med fast bredd. Så strängarna i minnet blir utfyllda till maximal längd av din deklarerade VARCHAR kolumn.

När din fråga implicit genererar en temporär tabell, till exempel vid sortering eller GROUP BY , detta kan använda mycket minne. Om du använder mycket VARCHAR(255) fält för data som inte behöver vara så långa, kan detta göra den tillfälliga tabellen väldigt stor.

Du kanske också gillar att veta att detta "utfyllnads"-beteende innebär att en sträng som deklareras med teckenuppsättningen utf8 läggs ut till tre byte per tecken även för strängar som du lagrar med innehåll i en byte (t.ex. ascii- eller latin1-tecken). Och likaså utf8mb4 teckenuppsättning gör att strängen utfylls till fyra byte per tecken i minnet.

Alltså en VARCHAR(255) i utf8 att lagra en kort sträng som "Ingen åsikt" tar 11 byte på disken (tio lägre teckenuppsättningar, plus en byte för längden) men det tar 765 byte i minnet, och därmed i temporära tabeller eller sorterade resultat.

Jag har hjälpt MySQL-användare som omedvetet skapade 1,5 GB temporära tabeller ofta och fyllde upp sitt diskutrymme. De hade massor av VARCHAR(255) kolumner som i praktiken lagrade mycket korta strängar.

Det är bäst att definiera kolumnen baserat på den typ av data som du tänker lagra. Det har fördelar att upprätthålla applikationsrelaterade begränsningar, som andra har nämnt. Men det har de fysiska fördelarna att undvika minnesslöseri som jag beskrev ovan.

Det är naturligtvis svårt att veta vad den längsta postadressen är, varför många väljer en lång VARCHAR det är säkert längre än någon adress. Och 255 är vanligt eftersom det är den maximala längden på en VARCHAR för vilken längden kan kodas med en byte. Det var också den maximala VARCHAR längd i MySQL äldre än 5.0.



  1. WHERE-klausul vs ON när du använder JOIN

  2. SQLite - Säkerhetskopiera en databas till fil

  3. Hur man infogar värden i en IDENTITY-kolumn i SQL Server

  4. Hur får man fram alla kolumnernamn för alla tabeller i MySQL?