Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Quels sont les cas d'utilisation pour sélectionner CHAR sur VARCHAR dans SQL ?

La règle générale est de choisir CHAR si toutes les lignes auront à peu près la même longueur . Choisissez VARCHAR (ou NVARCHAR ) lorsque la longueur varie significativement. CHAR peut aussi être un peu plus rapide car toutes les lignes ont la même longueur.

Cela varie selon l'implémentation de la base de données, mais généralement, VARCHAR (ou NVARCHAR ) utilise un ou deux octets de stockage supplémentaires (pour la longueur ou la terminaison) en plus des données réelles. Donc (en supposant que vous utilisez un jeu de caractères d'un octet) stockant le mot "FooBar"

  • CAR(6) =6 octets (pas de surcharge)
  • VARCHAR(100) =8 octets (2 octets de surcharge)
  • CAR(10) =10 octets (4 octets de déchets)

La ligne du bas est CHAR peut être plus rapide et plus peu encombrant pour des données relativement de même longueur (à moins de deux caractères de différence de longueur).

Remarque :Microsoft SQL a 2 octets de surcharge pour un VARCHAR. Cela peut varier d'une base de données à l'autre, mais généralement, il y a au moins 1 octet de temps système nécessaire pour indiquer la longueur ou l'EOL sur un VARCHAR.

Comme l'a souligné Gaven dans les commentaires :les choses changent en ce qui concerne les jeux de caractères multi-octets, et c'est un cas où VARCHAR devient un bien meilleur choix.

Remarque sur la longueur déclarée du VARCHAR :Parce qu'il stocke la longueur du contenu réel, vous ne gaspillez pas la longueur inutilisée. Donc stocker 6 caractères dans VARCHAR(6), VARCHAR(100), ou VARCHAR(MAX) utilise la même quantité de stockage. En savoir plus sur les différences lors de l'utilisation de VARCHAR(MAX). Vous déclarez un maximum taille dans VARCHAR pour limiter la quantité stockée.

Dans les commentaires, AlwaysLearning a souligné que les documents Microsoft Transact-SQL semblent dire le contraire. Je dirais qu'il s'agit d'une erreur ou du moins que la documentation n'est pas claire.