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

时间:2008-12-11 12:58:04

标签: sql sql-server casting

在SQL server 2005中查询

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

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

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

6 个答案:

答案 0 :(得分: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. < / p>

答案 1 :(得分:23)

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

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

很酷的问题!

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分: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)))