【问题标题】:Why is 30 the default length for VARCHAR when using CAST?为什么使用 CAST 时 VARCHAR 的默认长度为 30?
【发布时间】:2010-09-26 10:23:39
【问题描述】:

在 SQL Server 2005 中此查询

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

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

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

【问题讨论】:

  • 天哪——我不知道 CAST 会这样截断。我一直认为返回的 varchar 的大小会适合 CAST 填充的内容。我有一些代码要检查...bbl
  • 您更愿意使用 255,如 Informix、Sybase 和其他 DB 的默认值吗? (见下面我的回答)

标签: sql sql-server casting


【解决方案1】:

为什么不指定 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。

【讨论】:

  • +1。为什么不设置长度?不设置就是自找麻烦。
  • 这是一个快速而肮脏的查询,所以我没有指定。感谢您将我指向文档,尽管其中提到了它。
  • 你很幸运你在那里使用了它,如果你将参数指定为没有长度的 varchar,那么你会得到一个 1 个字符的 varchar。在转换为 varchar 或创建 varchar 或 nvarchar 的变量时,始终指定长度。
【解决方案2】:

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

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

非常酷的问题!

【讨论】:

  • varchar(30) 是当时 sysname 的数据类型(仍然是 Oracle 中标识符的最大长度)。也许他们只是认为与 14 或 62 相比,这将是一个方便的默认值。
  • @MartinSmith 可能是 Martin,这是一个有趣的事实,但再一次,它不是数据类型的默认长度,而只是 CAST 和 CONVERT 为该数据类型返回的长度。如果他们想使用 sysname 我假设他们会将数据类型本身的默认大小设置为 30 ,而不是 1 。但我们都在这里 ;->
  • 希望得到可靠和/或官方消息来源的回应 :)
【解决方案3】:

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

【讨论】:

  • 这也是 Sybase 中的行为,所以我认为早于微软的参与。
  • 任何指向解释此行为的文档的指针(名称和地址列的默认长度?)
  • 不是真的!.. 但是如果你看一下长度,30,它被广泛用于整个行业的那些类型的列。 MSDN link"备注在数据定义或变量声明语句中未指定n时,默认长度为1。在CAST函数中未指定n时,默认长度为30。"
  • 我的理论是默认的 30 个字符长度源自美国邮政服务规范的名称和地址行。 see here
  • @FrankR。 - 这应该是一个真正的答案。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 根据 SQL 标准,转换为无长度的 VARCHAR 应该是转换为 VARCHAR(1)。那没有用 - 所以你应该总是提供一个长度。有一种情况是 30 比 1 更好。我什至会同意。但是为什么是 30 而不是 25、32、40、64……啊啊;那就是疯狂!
    【解决方案6】:

    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)))
    

    【讨论】:

    • 此链接已由@curtisk 发布。此外,在此文档中的哪个位置声明他们选择默认的“覆盖前 30 个字符中的基本数据”。 ?
    • 使用 CAST 和 CONVERT 函数时不指定 n 时,默认长度为 30。参考:msdn.microsoft.com/en-us/library/ms176089.aspx
    • 错误?我已经接受了与您一样链接到相同文档的答案。你没有提供任何新的见解
    • 我刚刚回答了您在第一条评论中要求提供文档的问题。很遗憾,我没有检查您接受的答案
    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2020-09-16
    • 2013-08-05
    相关资源
    最近更新 更多