sql >> Database >  >> RDS >> Mysql

varchar(20) en varchar(50) hetzelfde zijn?

MySQL biedt een keuze aan storage-engines. De fysieke opslag van gegevens is afhankelijk van de opslagengine.

MijnISAM-opslag van VARCHAR

In MijnISAM, VARCHAR s bezetten meestal alleen de werkelijke lengte van de string plus een byte of twee lengte. Dit wordt praktisch gemaakt door de ontwerpbeperking van MyISAM tot tafelvergrendeling in plaats van rijvergrendeling. De gevolgen voor de prestaties zijn onder meer een compacter cacheprofiel, maar ook een meer gecompliceerde (langzamere) berekening van record-offsets.

(In feite geeft MyISAM u een zekere mate van keuze tussen vaste fysieke rijgrootte en variabele fysieke rijgrootte tabelformaten afhankelijk van kolomtypes die voorkomen in de hele tabel. Voorkomen van VARCHAR verandert alleen de standaardmethode, maar de aanwezigheid van een TEXT blob krachten VARCHAR s in dezelfde tabel om ook de variabele lengte methode te gebruiken.)

De fysieke opslagmethode is vooral belangrijk bij indexen, wat een ander verhaal is dan tabellen. MyISAM gebruikt ruimtecompressie voor beide CHAR en VARCHAR kolommen, wat betekent dat kortere gegevens in beide gevallen minder ruimte innemen in de index.

InnoDB-opslag van VARCHAR

InnoDB gebruikt, net als de meeste andere huidige relationele databases, een meer geavanceerd mechanisme. VARCHAR kolommen met een maximale breedte van minder dan 768 bytes worden inline opgeslagen, waarbij de gereserveerde ruimte overeenkomt met die maximale breedte. Nauwkeuriger hier :

InnoDB doet momenteel geen ruimtecompressie in zijn indexen, het tegenovergestelde van MyISAM zoals hierboven beschreven.

Terug naar de vraag

Al het bovenstaande is echter slechts een implementatiedetail dat zelfs tussen versies kan veranderen. Het echte verschil tussen CHAR en VARCHAR is semantisch, en dat geldt ook voor die tussen VARCHAR(20) en VARCHAR(50) . Door ervoor te zorgen dat er geen manier is om een ​​reeks van 30 tekens op te slaan in een VARCHAR(20) , maakt de database het leven gemakkelijker en beter gedefinieerd voor verschillende processors en applicaties die het zogenaamd integreert in een voorspelbaar gedragende oplossing. Dit is het belangrijkste.

Met betrekking tot persoonlijke namen specifiek, deze vraag kan je wat praktische handvatten geven. Mensen met volledige namen van meer dan 70 UTF-8-tekens hebben sowieso problemen.



  1. SET NULL:geef een tekenreeks op die moet worden geretourneerd wanneer een null-waarde voorkomt in SQLcl / SQL*Plus

  2. Datum- en tijdnotaties wijzigen in MySQL

  3. Waarde verhogen in MySQL-updatequery

  4. MariaDB Server 10.0.33 nu beschikbaar