sql >> Database >  >> RDS >> Mysql

Verschil tussen VARCHAR en TEXT in MySQL

TL;DR

TEXT

  • vaste maximale grootte van 65535 tekens (je kunt de maximale grootte niet beperken)
  • duurt 2 + c bytes schijfruimte, waarbij c is de lengte van de opgeslagen string.
  • kan niet (volledig) deel uitmaken van een index. Men zou een prefixlengte moeten specificeren.

VARCHAR(M)

  • variabele maximale grootte van M tekens
  • M moet tussen 1 en 65535 liggen
  • duurt 1 + c bytes (voor M ≤ 255) of 2 + c (voor 256 ≤ M ≤ 65535) bytes schijfruimte waar c is de lengte van de opgeslagen string
  • kan deel uitmaken van een index

Meer details

TEXT heeft een vaste maximale grootte van 2¹⁶-1 = 65535 tekens.
VARCHAR heeft een variabele maximale maat M tot M = 2¹⁶-1 .
Je kunt dus niet de grootte van TEXT kiezen maar dat kan voor een VARCHAR .

Het andere verschil is dat je geen index (behalve een fulltext index) op een TEXT kunt zetten kolom.
Dus als u een index op de kolom wilt hebben, moet u VARCHAR gebruiken . Maar merk op dat de lengte van een index ook beperkt is, dus als uw VARCHAR kolom is te lang, u hoeft alleen de eerste paar tekens van de VARCHAR . te gebruiken kolom in uw index (zie de documentatie voor CREATE INDEX ).

Maar u wilt ook VARCHAR . gebruiken , als u weet dat de maximale lengte van de mogelijke invoerreeks slechts M . is , bijv. een telefoonnummer of een naam of iets dergelijks. Dan kunt u VARCHAR(30) . gebruiken in plaats van TINYTEXT of TEXT en als iemand probeert de tekst van alle drie de "Lord of the Ring"-boeken op te slaan in je telefoonnummerkolom, sla je alleen de eerste 30 tekens op :)

Bewerken: Als de tekst die u in de database wilt opslaan langer is dan 65535 tekens, moet u MEDIUMTEXT kiezen of LONGTEXT , maar wees voorzichtig:MEDIUMTEXT slaat strings op tot 16 MB, LONGTEXT tot 4GB. Als u LONGTEXT gebruikt en verkrijg de gegevens via PHP (tenminste als je mysqli gebruikt) zonder store_result ), krijg je misschien een geheugentoewijzingsfout, omdat PHP 4 GB geheugen probeert toe te wijzen om er zeker van te zijn dat de hele string kan worden gebufferd. Dit gebeurt misschien ook in andere talen dan PHP.

U moet echter altijd controleer de invoer (Is het te lang? Bevat het vreemde code?) voor opslaan in de database.

Opmerking:voor beide typen hangt de benodigde schijfruimte alleen af ​​van de lengte van de opgeslagen string en niet van de maximale lengte.
Bijvoorbeeld als u de tekenset latin1 gebruikt en de tekst "Test" opslaat in VARCHAR(30) , VARCHAR(100) en TINYTEXT , het vereist altijd 5 bytes (1 byte om de lengte van de string op te slaan en 1 byte voor elk teken). Als u dezelfde tekst opslaat in een VARCHAR(2000) of een TEXT kolom, zou het ook dezelfde ruimte nodig hebben, maar in dit geval zou het 6 bytes zijn (2 bytes om de stringlengte op te slaan en 1 byte voor elk teken).

Bekijk voor meer informatie de documentatie .

Tot slot wil ik een opmerking toevoegen dat beide, TEXT en VARCHAR zijn gegevenstypen met variabele lengte en daarom minimaliseren ze hoogstwaarschijnlijk de ruimte die u nodig hebt om de gegevens op te slaan. Maar dit komt met een afweging voor prestaties. Als je betere prestaties nodig hebt, moet je een type met vaste lengte gebruiken, zoals CHAR . U kunt hier meer lezen over deze .



  1. Hoe de standaardbeperking van SQL te laten vallen zonder de naam te kennen?

  2. mysql pivot-queryresultaten met GROUP BY

  3. SQLAlchemy geen wachtwoord opgegeven fout

  4. FOUT:functies in index-expressie moeten worden gemarkeerd als IMMUTABLE in Postgres