【问题标题】:Why does VARCHAR need length specification?为什么 VARCHAR 需要长度规范?
【发布时间】:2010-07-01 10:11:09
【问题描述】:

为什么我们总是需要指定VARCHAR(length) 而不仅仅是VARCHAR?无论如何,它是动态的。

UPD:我对它是强制性的这一事实感到特别困惑(例如在 MySQL 中)。

【问题讨论】:

标签: sql database varchar


【解决方案1】:

VARCHAR的“长度”不是内容的长度,是内容的最大长度。

VARCHAR 的最大长度不是动态的,它是固定的,因此必须指定。

如果您不想为其定义最大大小,请使用 VARCHAR(MAX)。

【讨论】:

  • 为什么 VARCHAR 默认不表示 VARCHAR(MAX)? INT 有默认大小,那么为什么 VARCHAR 不能有默认大小?创建 SQL 标准时做出这一设计决策的原因是什么?
  • VARCHAR(MAX) 在创建 SQL Server 标准时不存在。它是 varchar(8000) 或文本。
  • VARCHAR(MAX) 在底层的处理方式与 VARCHAR(8000) (最大的非最大类型)不同。请仅在您真正需要时使用 VARCHAR(MAX),否则您的性能将受到影响。 dba.stackexchange.com/questions/173895/…
【解决方案2】:

首先,并非所有数据库都需要它。看SQL Server,这里是可选的。

无论如何,它定义了字段内容的最大大小。本身并不是一件坏事,而且它传达了意义(例如 - 电话号码,您不希望在该字段中使用国际号码)。

【讨论】:

  • 没错,不要在 SQL Server 中定义大小时要小心,因为它会根据场景默认为不同的东西,例如adathedev.co.uk/2010/04/sql-cast-to-varchar-without-size.html
  • "在数据定义或变量声明语句中未指定 n 时,默认长度为 1。使用 CAST 和 CONVERT 函数时未指定 n 时,默认长度为 30。"从提到的链接
【解决方案3】:

impact 可能的性能:在 MySQL 中,temporary tables 和 MEMORY tables 将 VARCHAR 列存储为固定长度列,填充到其最大长度。

如果您设计的VARCHAR 列比您需要的最大尺寸大得多,您将消耗更多的内存。这会影响cache efficiency, sorting speed等。

所以你给出了字符串下的最大长度。就像如果你的最大字符长度为 10,所以不要给他的长度 100 或更多。

【讨论】:

    【解决方案4】:

    您可以将其视为对数据的约束。它确保您不会存储违反约束的数据。它在概念上类似于例如整数列上的检查约束,确保只输入正值。

    【讨论】:

      【解决方案5】:

      数据库对它存储的数据了解得越多,它在使用请求搜索/添加/更新数据时就可以进行更多优化。

      【讨论】:

      • 比如基于varchar最大长度可以做哪些优化?
      【解决方案6】:

      答案是您不需要,这是可选的。

      如果你想确保字符串不超过一定长度,它就在那里。

      【讨论】:

        【解决方案7】:

        来自Wikipedia:

        Varchar 字段可以是任意大小 到极限。限额不同于 数据库类型,Oracle 9i 数据库有 4000 字节的限制,一个 MySQL 数据库的限制为 65,535 字节(整行)和 Microsoft SQL Server 2005 8000 字节 (除非使用 varchar(max),否则 最大存储容量为 2,147,483,648 字节)。

        【讨论】:

          【解决方案8】:

          正如@DimaFomin 在 cmets 中指出的那样,对于程序员来说最危险的事情是强制执行默认长度,如果没有指定长度。

          SQL Server 如何强制使用默认长度:

          declare @v varchar = '123'
          select @v
          

          结果:

          1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-08
            • 2018-07-31
            • 1970-01-01
            相关资源
            最近更新 更多