56

在 SQL Server 2005 中,此查询

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

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

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

4

6 回答 6

50

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

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

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

char 和 varchar (Transact-SQL)

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

于 2008-12-11T13:13:14.110 回答
33

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

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

很酷的问题!

于 2012-07-17T05:47:42.007 回答
5

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

于 2012-07-22T05:57:58.167 回答
4

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

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

于 2019-04-30T15:27:06.040 回答
3

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

于 2008-12-11T13:13:25.560 回答
0

convert/cast 的默认大小与内存分配无关,因此默认值(即 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)))
于 2012-07-17T19:18:40.073 回答