使用CAST时,为什么30是VARCHAR的默认长度?

问题描述 投票:42回答:6

在SQL Server 2005中这个查询

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

返回30作为长度,而提供的字符串有更多的字符。这似乎是默认的。为什么30,而不是32或2的任何其他权力?

[编辑]我知道我应该总是在转换为varchar时指定长度,但这是一个快速的让我们检查一下的查询。问题仍然存在,为什么30?

sql sql-server casting
6个回答
43
投票

为什么不指定varchar长度?即:

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

至于为什么30,这是SQL Server中该类型的默认长度。

来自char and varchar (Transact-SQL)

如果未在数据定义或变量声明语句中指定n,则默认长度为1.如果在使用CAST和CONVERT函数时未指定n,则默认长度为30。


23
投票

关于为什么30而不是32或2的任何其他幂的问题,对于varchar(n),存储大小是n + 2个字节,这使得字节存储大小为32为长度为30的字符串。可能是这是他们看了什么?

然后只是一些注释的清晰点:未指定长度varchar字段的默认长度是n = 1。 CAST或CONVERT为此数据类型的转换返回的默认字符串长度为30。

很酷的问题!


3
投票

我不知道为什么他们选择了30,但在Sybase SQL Server中也是如此,微软的SQL Server是从它开发的。它似乎是那些RDBMS的特性,因为它不在SQL标准中,并且其他服务器的行为也不同。


3
投票

Microsoft在SQL Server,Access'Jet DB引擎和其他几个产品中选择30作为CHAR和VARCHAR的默认长度。它起源于过去,当名称或地址列的默认长度最初设置为30.其他DB如Informix默认为20表示CHAR,255表示VARCHAR。


1
投票

我的理论是,默认的30个字符长度来自美国邮政服务规范和名称和地址:

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


0
投票

转换/强制转换的默认大小与内存分配无关,因此默认值(即30)与2的任何幂无关。

关于为什么30,这是微软的指南,它给出了这个默认值,以便覆盖前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)))
© www.soinside.com 2019 - 2024. All rights reserved.