Почему длина 30 по умолчанию для VARCHAR при использовании CAST? - PullRequest
43 голосов
/ 11 декабря 2008

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

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

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

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

Ответы [ 6 ]

43 голосов
/ 11 декабря 2008

Почему бы вам не указать длину 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.

23 голосов
/ 17 июля 2012

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

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

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

3 голосов
/ 22 июля 2012

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

3 голосов
/ 11 декабря 2008

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

1 голос
/ 30 апреля 2019

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

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

0 голосов
/ 17 июля 2012

Размер по умолчанию с преобразованием / приведением не имеет ничего общего с распределением памяти, и, следовательно, значение по умолчанию (т.е. 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...