sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er use cases for at vælge CHAR frem for VARCHAR i SQL?

Den generelle regel er at vælge CHAR hvis alle rækker vil have tæt på samme længde . Vælg VARCHAR (eller NVARCHAR ), når længden varierer væsentligt. CHAR kan også være en smule hurtigere, fordi alle rækkerne er af samme længde.

Det varierer efter DB-implementering, men generelt VARCHAR (eller NVARCHAR ) bruger en eller to ekstra bytes lager (til længde eller opsigelse) ud over de faktiske data. Så (forudsat at du bruger et 1-byte tegnsæt) gemmer ordet "FooBar"

  • CHAR(6) =6 bytes (ingen overhead)
  • VARCHAR(100) =8 bytes (2 bytes overhead)
  • CHAR(10) =10 bytes (4 bytes spild)

Bundlinjen er CHAR kan være hurtigere og mere pladseffektiv for data af relativt samme længde (inden for to tegns længdeforskel).

Bemærk :Microsoft SQL har 2 bytes overhead til en VARCHAR. Dette kan variere fra DB til DB, men generelt er der mindst 1 byte overhead nødvendig for at angive længde eller EOL på en VARCHAR.

Som det blev påpeget af Gaven i kommentarerne:Tingene ændrer sig, når det kommer til multi-byte tegnsæt, og det er et tilfælde, hvor VARCHAR bliver et meget bedre valg.

En note om den deklarerede længde af VARCHAR :Fordi den gemmer længden af ​​det faktiske indhold, så spilder du ikke ubrugt længde. Så lagring af 6 tegn i VARCHAR(6), VARCHAR(100), eller VARCHAR(MAX) bruger den samme mængde lagerplads. Læs mere om forskellene ved brug af VARCHAR(MAX). Du erklærer et maksimum størrelse i VARCHAR for at begrænse, hvor meget der lagres.

I kommentarerne påpegede AlwaysLearning, at Microsoft Transact-SQL-dokumenterne synes at sige det modsatte. Jeg vil foreslå, at det er en fejl, eller i det mindste er dokumenterne uklare.



  1. To kolonner i underforespørgsel i where-klausul

  2. få adgang til et kolonnealias i where-sætningen i postgresql

  3. Mysql tæller forekomster af understreng, og bestil derefter efter

  4. SQL DELETE for begyndere