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

Sql 为什么在使用CAST时,30是VARCHAR的默认长度?,sql,sql-server,casting,Sql,Sql Server,Casting,在SQLServer2005中,此查询 select len(cast('the quick brown fox jumped over the lazy dog' as varchar)) 返回30作为长度,而提供的字符串包含更多字符。这似乎是默认情况。为什么是30,而不是32或任何其他2的幂 [EDIT]我知道,在强制转换到varchar时,我应该始终指定长度,但这是一个快速的“让我们检查一下”查询。问题仍然存在,为什么是30?为什么不指定varchar长度?即: SELECT CAST(

在SQLServer2005中,此查询

select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
返回30作为长度,而提供的字符串包含更多字符。这似乎是默认情况。为什么是30,而不是32或任何其他2的幂


[EDIT]我知道,在强制转换到varchar时,我应该始终指定长度,但这是一个快速的“让我们检查一下”查询。问题仍然存在,为什么是30?

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

SELECT CAST('the quick brown fox jumped over the lazy dog' AS VARCHAR(45))
至于为什么是30,这是SQL Server中该类型的默认长度

发件人:


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


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

关于为什么是30而不是32或任何其他2的幂,对于varchar(n),存储大小为n+2字节,这使得长度为30的字符串的字节存储大小为32。也许这就是他们看到的

然后,对一些注释进行澄清:未指定长度的varchar字段的默认长度为n=1。对于此数据类型的转换,强制转换或转换返回的默认字符串长度为30


很酷的问题

convert/cast的默认大小与内存分配无关,因此默认值(即30)与2的任何幂无关

关于为什么是30,这是微软的指南,它给出了这个默认值,以便覆盖前30个字符中的基本数据。

尽管在转换/铸造过程中,人们总是可以改变长度

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

Microsoft在SQL Server、Access的Jet DB引擎和其他一些产品中选择30作为CHAR和VARCHAR的默认长度。它起源于旧时代,当时名称或地址列的默认长度最初设置为30。其他数据库,如Informix,CHAR默认为20,VARCHAR默认为255

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


根据SQL标准,对VARCHAR的无长度转换应该是对VARCHAR的转换(1)。这是没有用的-所以你应该总是提供一个长度。有一种情况是30比1更好;我甚至同意。但是为什么30而不是25,32,40,64。。。啊,;那就是疯狂!天哪,我不知道演员会这样截短。我一直认为返回的varchar的大小将适合装入其中的CAST。我有一些代码要检查…BBL您希望它是255吗,像Informix、Sybase和其他DB的默认值一样?(见下面我的答案)+1。你为什么不定一下长度?不设置它是自找麻烦。这是一个快速而肮脏的查询,所以我没有指定。谢谢你给我指出文档中提到的内容。你很幸运你在那里使用了它,如果你把一个参数指定为没有长度的varchar,那么你会得到一个1个字符的varchar。在强制转换为varchar或创建varaiable(varchar或nvarchar)时,始终指定长度。
varchar(30)
是当时
sysname
的数据类型(仍然是Oracle中标识符的最大长度)。也许他们只是认为与14或62相比,这是一个方便的默认值。@MartinSmith可能是Martin,并且是一个相互测试的事实,但再一次,它不是数据类型的默认长度,而只是该数据类型的强制转换和转换返回的长度。如果他们想使用sysname,我假设他们会将数据类型本身的默认大小设置为30,而不是1。但我们都在这里探索;->希望得到可靠和/或官方消息来源的回复:)这也是Sybase中的行为,因此我推测这可能早于微软的参与。任何指向解释此行为的文档(名称和地址列的默认长度?)的指针都不是真的!。。但如果你看长度,30,它被广泛用于整个行业的这些类型的列。“备注:如果数据定义或变量声明语句中未指定n,则默认长度为1。如果未使用CAST函数指定n,则默认长度为30。”我的理论是,默认长度为30个字符的长度源自美国邮政局的名称和地址行规范@弗兰克这应该是一个答案。这个链接已经由@Curtik发布了。此外,在本文件中,他们在何处选择了默认值“以前30个字符覆盖基本数据”。?如果在使用强制转换和转换函数时未指定n,则默认长度为30。参考:呃?我已经接受了与您相同的文档链接的答案。您没有提供新的见解whatsoeverI只是回答了您在第一次评论中要求提供文档的问题。不幸的是,我没有检查你接受的答案