在 SQL Server 2005 中,此查询
select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
返回 30 作为长度,而提供的字符串有更多字符。这似乎是默认值。为什么是 30,而不是 32 或 2 的任何其他幂?
[编辑]我知道在转换为 varchar 时我应该始终指定长度,但这是一个快速的让我们检查一些东西的查询。问题仍然存在,为什么是 30?
在 SQL Server 2005 中,此查询
select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
返回 30 作为长度,而提供的字符串有更多字符。这似乎是默认值。为什么是 30,而不是 32 或 2 的任何其他幂?
[编辑]我知道在转换为 varchar 时我应该始终指定长度,但这是一个快速的让我们检查一些东西的查询。问题仍然存在,为什么是 30?
为什么不指定 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。
关于为什么 30 而不是 32 或 2 的任何其他幂的问题,varchar(n) 的存储大小为 n + 2 个字节,这使得长度为 30 的字符串的字节存储大小为 32。可能是他们在看什么?
然后只是对一些注释进行澄清:未指定长度的 varchar 字段的默认长度是 n=1。CAST 或 CONVERT 针对此数据类型的转换返回的默认字符串长度为 30。
很酷的问题!
Microsoft 在 SQL Server、Access 的 Jet DB 引擎和他们的其他几个产品中选择 30 作为 CHAR 和 VARCHAR 的默认长度。它起源于过去,名称或地址列的默认长度最初设置为 30。其他数据库(如 Informix)默认 CHAR 为 20,VARCHAR 为 255。
我的理论是默认的 30 个字符长度源自美国邮政服务规范的名称和地址行:
我不知道他们为什么选择 30,但在 Sybase SQL Server 中也是如此,微软的 SQL Server 就是从它开发的。这似乎是这些 RDBMS 的一个特性,因为它不在 SQL 标准中,并且其他服务器的行为也有所不同。
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)))