Почему длина 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?

11.12.2008 12:58:03
Святое дерьмо - я не знал, что CAST будет обрезать вот так. Я всегда предполагал, что возвращающийся varchar будет иметь размеры, соответствующие тому, что в него вставлял CAST. У меня есть код, чтобы проверить ... BBL
Michael Haren 11.12.2008 13:54:06
Вы бы предпочли 255, как Informix, Sybase и другие базы данных по умолчанию? (см. мой ответ ниже)
Frank R. 22.07.2012 12:04:25
6 ОТВЕТОВ
РЕШЕНИЕ

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

48
19.04.2018 13:32:31
+1. Почему бы вам не установить длину? Не установка это вызывает проблемы.
Bert 11.12.2008 17:19:13
Это был быстрый и грязный запрос, поэтому я не уточнил. Спасибо, что указали мне на документы, хотя там, где это упоминается, хотя.
edosoft 12.12.2008 10:49:57
Вам повезло, что вы использовали его там, если бы вы указали параметр как varchar без длины, то вы бы получили 1 символьный varchar. Всегда всегда указывайте длину при приведении к varchar или создании varaiable, который является varchar или nvarchar.
HLGEM 7.11.2011 19:05:22

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

3
11.12.2008 13:13:25
Согласно стандарту SQL приведение к VARCHAR без длины должно быть приведением к VARCHAR (1). Это не полезно - поэтому вы всегда должны указывать длину. Есть случай, когда 30 лучше по умолчанию, чем 1; Я бы даже согласился. Но почему 30 вместо 25, 32, 40, 64, ... ааааа; так лежит безумие!
Jonathan Leffler 11.12.2008 13:43:50

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

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

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

27
17.07.2012 18:46:34
varchar(30)был типом данных sysnameтогда (и все еще является максимальной длиной идентификаторов в Oracle). Может быть, они просто думали, что это будет удобный дефолт по сравнению, скажем, с 14 или 62.
Martin Smith 17.07.2012 22:00:05
@MartinSmith Может быть Мартином, и это интересный факт, но опять же, это не длина по умолчанию для типа данных, а скорее только для того, что CAST и CONVERT возвращают для этого типа данных. Если бы они хотели использовать sysname, я бы предположил, что они установили бы размер по умолчанию для самого типа данных 30, а не 1. Но мы все здесь уходим; ->
Charl 18.07.2012 07:39:18
Надеясь на ответ из надежного и / или официального источника :)
edosoft 19.07.2012 09:29:09

Размер по умолчанию с convert / cast не имеет ничего общего с распределением памяти, и, следовательно, значение по умолчанию (т.е. 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)))
0
20.09.2013 13:00:03
Эта ссылка была уже размещена @curtisk. Кроме того, где в этом документе указано, что они выбирают значение по умолчанию «для покрытия основных данных в первых 30 символах». ?
edosoft 22.07.2012 20:58:52
Если n не указано при использовании функций CAST и CONVERT, длина по умолчанию равна 30. Ссылка: msdn.microsoft.com/en-us/library/ms176089.aspx
NG. 23.07.2012 07:34:19
Err? Я уже принял ответ, связанный с той же документацией, что и вы. Вы не предоставили никакой новой информации
edosoft 23.07.2012 17:02:41
Я только что ответил на вопрос, который вы задали для документации в вашем первом комментарии. К сожалению, я не проверил ответ, который вы приняли
NG. 24.07.2012 02:25:12

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

3
22.07.2012 05:57:58
Такое поведение и в Sybase, поэтому, я полагаю, предшествует участию Microsoft.
Martin Smith 22.07.2012 08:31:09
Любой указатель на документ, объясняющий это поведение (длина по умолчанию столбцов имени и адреса?)
edosoft 22.07.2012 21:01:12
Не совсем! .. Но если вы посмотрите на длину 30, она широко использовалась для колонок такого типа во всей отрасли. Ссылка MSDN «Замечания Когда n не указано в определении данных или в объявлении переменной, длина по умолчанию равна 1. Когда n не указана с помощью функции CAST, длина по умолчанию равна 30».
Frank R. 22.07.2012 21:14:52
Моя теория состоит в том, что длина по умолчанию в 30 символов возникла из спецификаций почтовой службы США для строк имени и адреса. смотрите здесь
Frank R. 22.07.2012 21:47:06
@FrankR. - это действительно должен быть ответ.
Alex 30.04.2019 08:31:42

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

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

4
30.04.2019 15:27:06