在SQL server 2005中查询
select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
返回30作为长度,而提供的字符串有更多字符。这似乎是默认的。为什么30,而不是32或2的任何其他权力?
[编辑] 我知道在转换为varchar时我应该总是指定长度,但这是一个快速的让我们检查一下的查询。问题仍然存在,为什么30?
答案 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个字符长度源自美国邮政服务对名称和地址行的规范:
答案 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)))