sql >> Database teknologi >  >> RDS >> Mysql

Forskellen mellem VARCHAR og TEXT i MySQL

TL;DR

TEXT

  • fast maks. størrelse på 65535 tegn (du kan ikke begrænse maks. størrelse)
  • tager 2 + c bytes diskplads, hvor c er længden af ​​den lagrede streng.
  • kan ikke være (helt) en del af et indeks. Man skal angive en præfikslængde.

VARCHAR(M)

  • variabel maks. størrelse på M tegn
  • M skal være mellem 1 og 65535
  • tager 1 + c bytes (for M ≤ 255) eller 2 + c (for 256 ≤ M ≤ 65535) bytes diskplads hvor c er længden af ​​den lagrede streng
  • kan være en del af et indeks

Flere detaljer

TEXT har en rettet maks. størrelse på 2¹⁶-1 = 65535 tegn.
VARCHAR har en variabel maks. størrelse M op til M = 2¹⁶-1 .
Så du kan ikke vælge størrelsen på TEXT men du kan for en VARCHAR .

Den anden forskel er, at du ikke kan sætte et indeks (undtagen et fuldtekstindeks) på en TEXT kolonne.
Så hvis du vil have et indeks på kolonnen, skal du bruge VARCHAR . Men bemærk, at længden af ​​et indeks også er begrænset, så hvis din VARCHAR kolonnen er for lang, du skal kun bruge de første par tegn i VARCHAR kolonne i dit indeks (se dokumentationen for CREATE INDEX ).

Men du vil også bruge VARCHAR , hvis du ved, at den maksimale længde af den mulige inputstreng kun er M , for eksempel. et telefonnummer eller et navn eller sådan noget. Så kan du bruge VARCHAR(30) i stedet for TINYTEXT eller TEXT og hvis nogen forsøger at gemme teksten fra alle tre "Ringens Herre"-bøger i din telefonnummerkolonne, gemmer du kun de første 30 tegn :)

Rediger: Hvis teksten du vil gemme i databasen er længere end 65535 tegn, skal du vælge MEDIUMTEXT eller LONGTEXT , men vær forsigtig:MEDIUMTEXT gemmer strenge op til 16 MB, LONGTEXT op til 4 GB. Hvis du bruger LONGTEXT og få dataene via PHP (i hvert fald hvis du bruger mysqli uden store_result ), får du måske en hukommelsesallokeringsfejl, fordi PHP forsøger at allokere 4 GB hukommelse for at være sikker på, at hele strengen kan bufres. Dette sker måske også på andre sprog end PHP.

Du bør dog altid tjek inputtet (er det for langt? Indeholder det mærkelig kode?) før gemmer det i databasen.

Bemærk:For begge typer afhænger den nødvendige diskplads kun af længden af ​​den lagrede streng og ikke af den maksimale længde.
F.eks. hvis du bruger tegnsættet latin1 og gemmer teksten "Test" i VARCHAR(30) , VARCHAR(100) og TINYTEXT , kræver det altid 5 byte (1 byte til at gemme længden af ​​strengen og 1 byte for hvert tegn). Hvis du gemmer den samme tekst i en VARCHAR(2000) eller en TEXT kolonne, ville den også kræve den samme plads, men i dette tilfælde ville den være 6 bytes (2 bytes til at gemme strengens længde og 1 byte for hvert tegn).

For mere information se dokumentationen .

Til sidst vil jeg tilføje en meddelelse om, at begge, TEXT og VARCHAR er datatyper med variabel længde, og derfor minimerer de højst sandsynligt den plads, du har brug for til at gemme dataene. Men dette kommer med en afvejning for ydeevne. Hvis du har brug for bedre ydeevne, skal du bruge en type med fast længde som CHAR . Du kan læse mere om dette her .



  1. Hvordan kan jeg sikkerhedskopiere en ekstern SQL Server-database til et lokalt drev?

  2. Sådan formateres tal med ledende nuller i SQLite

  3. Hvordan kan jeg oprette en bruger i SQL Server Express-databasen, jeg føjede til mit projekt?

  4. MySQL Omdøb kolonne