web-dev-qa-db-fra.com

Pourquoi 30 est-il la longueur par défaut pour VARCHAR lors de l'utilisation de CAST?

Dans SQL Server 2005, cette requête

select len(cast('the quick brown fox jumped over the lazy dog' as varchar))

renvoie 30 comme longueur tandis que la chaîne fournie a plus de caractères. Cela semble être la valeur par défaut. Pourquoi 30, et non 32 ou toute autre puissance de 2?

[EDIT] Je suis conscient que je devrais toujours spécifier la longueur lors du transtypage vers varchar mais c'était une requête rapide pour vérifier quelque chose. Des questions demeurent, pourquoi 30?

43
edosoft

Pourquoi ne spécifiez-vous pas la longueur du varchar? c'est à dire:

SELECT CAST('the quick brown fox jumped over the lazy dog' AS VARCHAR(45))

En ce qui concerne pourquoi 30, c'est la longueur par défaut dans SQL Server pour ce type.

De char et varchar (Transact-SQL) :

Lorsque n n'est pas spécifié dans une définition de données ou une déclaration de variable, la longueur par défaut est 1. Lorsque n n'est pas spécifié lors de l'utilisation des fonctions CAST et CONVERT, la longueur par défaut est 30.

43
curtisk

Sur votre question de savoir pourquoi 30 et non 32 ou toute autre puissance de 2, la taille de stockage est n + 2 octets pour varchar (n), ce qui rend la taille de stockage d'octets 32 pour une chaîne de longueur 30. Peut-être que c'est ce qu'ils ont regardé?

Ensuite, juste un point de clarté sur certains des commentaires: La longueur par défaut pour un champ varchar de longueur non spécifiée est n = 1. La longueur de chaîne par défaut que CAST ou CONVERT renvoie pour une conversion de ce type de données est 30.

Question très cool!

23
Charl

Je ne sais pas pourquoi ils ont choisi 30, mais c'était la même chose dans Sybase SQL Server, à partir duquel SQL Server de Microsoft a été développé. Il semble que ce soit une particularité de ces SGBDR car ce n'est pas dans les normes SQL, et les autres serveurs diffèrent dans leur comportement.

3
xahtep

Microsoft a choisi 30 comme longueur par défaut pour CHAR et VARCHAR dans SQL Server, le moteur Jet DB d'Access et plusieurs autres de leurs produits. Il provient de l'ancien temps où la longueur par défaut d'une colonne de nom ou d'adresse était initialement définie à 30. D'autres bases de données comme Informix par défaut à 20 pour CHAR et 255 pour VARCHAR.

3
Frank R.

Ma théorie est que la longueur par défaut de 30 caractères provient des spécifications du service postal américain pour les lignes de nom et d'adresse:

http://pe.usps.gov/cpim/ftp/pubs/pub28/pub28.pdf

1
Frank R.

La taille par défaut avec convert/cast n'a rien à voir avec l'allocation de mémoire et donc la valeur par défaut (c'est-à-dire 30) n'est liée à aucune puissance de 2.

concernant pourquoi 30, c'est la directive de Microsoft qui donne cette valeur par défaut afin de couvrir les données de base en 30 premiers caractères. http://msdn.Microsoft.com/en-us/library/ms176089.aspx

Bien que l'on puisse toujours modifier la longueur pendant le processus de conversion/cast

select len(cast('the quick brown fox jumped over the lazy dog' as varchar(max)))
0
NG.