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

edo*_*oft 47 sql sql-server casting

在SQL Server 2005中这个查询

select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
Run Code Online (Sandbox Code Playgroud)

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

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

cur*_*isk 45

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

SELECT CAST('the quick brown fox jumped over the lazy dog' AS VARCHAR(45))
Run Code Online (Sandbox Code Playgroud)

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

来自char和varchar(Transact-SQL):

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

  • 这是一个快速而肮脏的查询,所以我没有指定.感谢您将文档指向了虽然提到它的文档. (2认同)

Cha*_*arl 26

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

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

很酷的问题!

  • `varchar(30)`当时是`sysname`的数据类型(仍然是Oracle中标识符的最大长度).也许他们只是认为这比14或62更方便. (6认同)

Fra*_* R. 5

Microsoft 选择 30 作为 SQL Server、Access 的 Jet DB 引擎及其其他产品中 CHAR 和 VARCHAR 的默认长度。它起源于过去,名称或地址列的默认长度最初设置为 30。其他 DB(例如 Informix)对于 CHAR 默认为 20,对于 VARCHAR 默认为 255。

  • 我的理论是,默认的 30 个字符长度源自美国邮政服务的姓名和地址行规范。[参见此处](http://pe.usps.gov/cpim/ftp/pubs/pub28/pub28.pdf) (3认同)