Pourquoi 30 est la longueur par défaut pour VARCHAR lorsque vous utilisez 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 alors que la string fournie contient plus de caractères. Cela semble être le défaut. Pourquoi 30, et pas 32 ou toute autre puissance de 2?

[EDIT] Je suis conscient que je devrais toujours préciser la longueur de la conversion en varchar mais c'était une requête rapide de lets-check-something. Des questions restnt, pourquoi 30?

Pourquoi ne spécifiez-vous pas la longueur de 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 le server SQL 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 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.

Sur votre question de savoir pourquoi 30 et pas 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 octet 32 ​​pour une string de longueur 30. Peut-être que c'est ce qu'ils ont regardé?

Voici juste un sharepoint clarté sur certains commentaires: La longueur par défaut pour un champ varchar de longueur indéterminée est n = 1. La longueur de string par défaut renvoyée par CAST ou CONVERT pour une conversion de ce type de données est 30.

Très bonne question!

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

Microsoft a choisi 30 comme longueur par défaut pour CHAR et VARCHAR dans SQL Server, Access 'Jet DB Engine et plusieurs autres de leurs produits. Il provient des anciens jours où la longueur par défaut d'une colonne de nom ou d'adresse était initialement fixée à 30. D'autres DB comme Informix par défaut à 20 pour CHAR et 255 pour VARCHAR.

La taille par défaut avec convert / cast n'a rien à voir avec l'allocation de memory et donc la valeur par défaut (ie 30) n'est pas liée à une puissance de 2.

En ce qui concerne pourquoi 30, c'est la directive de Microsoft qui donne cette valeur par défaut de manière à couvrir datatables de base dans les 30 premiers caractères. http://msdn.microsoft.com/en-us/library/ms176089.aspx

Bien que l'on puisse toujours modifier la longueur pendant le process de conversion / moulage

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