2008-12-11 1 views
34

В SQL Server 2005 Этот запросПочему 30-кратная длина для VARCHAR при использовании CAST?

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

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

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

+10

Святое дерьмо - я не знал, что CAST усекается вот так. Я всегда предполагал, что возвращаемый varchar будет иметь размер, соответствующий тому, что CAST в него вставлял. У меня есть код для проверки ... bbl – 2008-12-11 13:54:06

+0

Вы бы предпочли, чтобы он был 255, как Informix, Sybase и другие DB по умолчанию? (см. мой ответ ниже) – 2012-07-22 12:04:25

ответ

35

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

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

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

От char and varchar (Transact-SQL):

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

+1

+1. Почему бы вам не задать длину? Не устанавливая, он просит неприятностей. – Bert 2008-12-11 17:19:13

+2

Это был быстрый и грязный запрос, поэтому я не уточнил. Спасибо, что указали мне на документы, хотя там, где это упоминается. – edosoft 2008-12-12 10:49:57

+0

Вам повезло, что вы использовали его там, если бы вы указали параметр как varchar без длины, тогда вы получили бы 1-символьный varchar. Всегда alwys указывают длину при кастинге на varchar или создание varaiable, которое является varchar или nvarchar. – HLGEM 2011-11-07 19:05:22

3

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

+3

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

20

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

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

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

0

По умолчанию размера с новообращенным/гипсом не имеет ничего общего с распределением памяти и, следовательно, значение по умолчанию (то есть 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))) 
2

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