Почему 30 процентов по умолчанию для VARCHAR при использовании CAST?

В SQL Server 2005 этот запрос

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

возвращает 30 в качестве длины, в то время как предоставленная строка имеет больше символов. Кажется, это по умолчанию. Почему 30, а не 32 или любая другая степень 2?

[EDIT] Я знаю, что всегда должен указывать длину при приведении к varchar, но это был быстрый запрос "давайте что-нибудь проверим". Остается вопрос, почему 30?

Ответ 1

Почему бы вам не указать длину varchar? то есть:

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

Насколько 30, это длина по умолчанию в SQL Server для этого типа.

Из char и varchar (Transact-SQL):

Если n не указано в определении данных или в объявлении переменной, длина по умолчанию равна 1. Когда n не указана при использовании функций CAST и CONVERT, длина по умолчанию равна 30.

Ответ 2

По вашему вопросу о том, почему 30, а не 32 или любая другая сила 2, размер хранилища составляет n + 2 байта для varchar (n), что делает размер 32 байтового хранилища для строки длиной 30. Возможно что это то, на что они смотрели?

Тогда просто точка ясности некоторых комментариев: длина по умолчанию для неопределенного поля varchar длины равна n = 1. Длина строки по умолчанию, возвращаемая CAST или CONVERT для преобразования этого типа данных, равна 30.

Очень крутой вопрос!

Ответ 3

Я не знаю, почему они выбрали 30, но это было то же самое в Sybase SQL Server, из которого был разработан Microsoft SQL Server. Кажется, это особенность этих РСУБД, как это не в стандартах SQL, а другие серверы отличаются своим поведением.

Ответ 4

Microsoft выбрала 30 в качестве длины по умолчанию для CHAR и VARCHAR в SQL Server, Access 'Jet DB engine и нескольких других своих продуктов. Он исходит из старых дней, когда размер по умолчанию для столбца имени или адреса был установлен на 30. Другие БД, такие как Informix по умолчанию для 20 для CHAR и 255 для VARCHAR.

Ответ 5

Размер по умолчанию с преобразованием/литой не имеет ничего общего с распределением памяти, и, следовательно, значение по умолчанию (т.е. 30) не связано ни с какой мощностью 2.

о том, почему 30, это руководство по Microsoft, которое дает это значение по умолчанию, чтобы покрыть основные данные в первых 30 символах. http://msdn.microsoft.com/en-us/library/ms176089.aspx

Хотя во время процесса конвертации/литья всегда можно изменить длину

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

Ответ 6

Моя теория состоит в том, что длина по умолчанию 30 символов произошла из спецификаций Почтовой службы США для строк имени и адреса:

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