sql >> Database >  >> RDS >> Sqlserver

Wat zijn de use-cases voor het selecteren van CHAR boven VARCHAR in SQL?

De algemene regel is om CHAR . te kiezen als alle rijen bijna dezelfde lengte hebben . Kies VARCHAR (of NVARCHAR ) wanneer de lengte varieert aanzienlijk. CHAR kan ook wat sneller zijn omdat alle rijen even lang zijn.

Het verschilt per DB-implementatie, maar over het algemeen is VARCHAR (of NVARCHAR ) gebruikt een of twee extra bytes opslagruimte (voor lengte of beëindiging) naast de feitelijke gegevens. Dus (ervan uitgaande dat u een tekenset van één byte gebruikt) slaat u het woord "FooBar" op

  • CHAR(6) =6 bytes (geen overhead)
  • VARCHAR(100) =8 bytes (2 bytes overhead)
  • CHAR(10) =10 bytes (4 bytes afval)

De bottom line is CHAR kan wees sneller en meer ruimtebesparend voor gegevens van relatief dezelfde lengte (binnen een lengteverschil van twee tekens).

Opmerking :Microsoft SQL heeft 2 bytes overhead voor een VARCHAR. Dit kan variëren van DB tot DB, maar over het algemeen is er minimaal 1 byte overhead nodig om de lengte of EOL op een VARCHAR aan te geven.

Zoals werd opgemerkt door Gaven in de opmerkingen:Dingen veranderen als het gaat om multi-byte tekensets, en het is een geval waarin VARCHAR een veel betere keuze wordt.

Een opmerking over de aangegeven lengte van de VARCHAR :Omdat het de lengte van de daadwerkelijke inhoud opslaat, verspilt u geen ongebruikte lengte. Dus 6 karakters opslaan in VARCHAR(6), VARCHAR(100), of VARCHAR(MAX) gebruikt dezelfde hoeveelheid opslagruimte. Lees meer over de verschillen bij het gebruik van VARCHAR(MAX). U declareert een maximum grootte in VARCHAR om te beperken hoeveel er wordt opgeslagen.

In de opmerkingen wees AlwaysLearning erop dat de Microsoft Transact-SQL-documenten het tegenovergestelde lijken te zeggen. Ik zou willen voorstellen dat dit een fout is of dat de documenten in ieder geval onduidelijk zijn.



  1. Echte escape-tekenreeks en PDO

  2. Oracle Fast Recovery Area

  3. Migreren van MySQL naar PostgreSQL

  4. Hoe Atan() werkt in PostgreSQL