Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was sind die Anwendungsfälle für die Auswahl von CHAR über VARCHAR in SQL?

Die allgemeine Regel ist, CHAR auszuwählen wenn alle Zeilen annähernd die gleiche Länge haben . Wählen Sie VARCHAR (oder NVARCHAR ), wenn die Länge variiert bedeutend. CHAR kann auch etwas schneller sein, weil alle Zeilen die gleiche Länge haben.

Sie variiert je nach DB-Implementierung, aber im Allgemeinen ist VARCHAR (oder NVARCHAR ) verwendet zusätzlich zu den eigentlichen Daten ein oder zwei weitere Bytes Speicherplatz (für Länge oder Terminierung). Also (vorausgesetzt, Sie verwenden einen Ein-Byte-Zeichensatz) Speichern des Wortes "FooBar"

  • CHAR(6) =6 Bytes (kein Overhead)
  • VARCHAR(100) =8 Byte (2 Byte Overhead)
  • CHAR(10) =10 Bytes (4 Bytes Verschwendung)

Die untere Zeile ist CHAR kann schneller sein und platzsparender für Daten relativ gleicher Länge (innerhalb von zwei Zeichen Längenunterschied).

Hinweis :Microsoft SQL hat 2 Byte Overhead für ein VARCHAR. Dies kann von DB zu DB variieren, aber im Allgemeinen wird mindestens 1 Byte Overhead benötigt, um Länge oder EOL auf einem VARCHAR anzugeben.

Wie von Gaven betont wurde in den Kommentaren:Die Dinge ändern sich, wenn es um Multibyte-Zeichensätze geht, und in diesem Fall ist VARCHAR eine viel bessere Wahl.

Ein Hinweis zur deklarierten Länge von VARCHAR :Da es die Länge des tatsächlichen Inhalts speichert, verschwenden Sie keine ungenutzte Länge. Speichern Sie also 6 Zeichen in VARCHAR(6), VARCHAR(100), oder VARCHAR(MAX) verwendet die gleiche Menge an Speicher. Lesen Sie mehr über die Unterschiede bei der Verwendung von VARCHAR(MAX). Sie deklarieren ein Maximum Größe in VARCHAR, um zu begrenzen, wie viel gespeichert wird.

In den Kommentaren wies AlwaysLearning darauf hin, dass die Microsoft Transact-SQL-Dokumentation das Gegenteil zu sagen scheint. Ich würde vorschlagen, dass dies ein Fehler ist oder zumindest die Dokumentation unklar ist.