【问题标题】:What's the purpose of varchar(0)varchar(0) 的目的是什么
【发布时间】:2014-02-28 14:23:01
【问题描述】:

我最近遇到了一个由数据库创建脚本中的拼写错误引起的问题,数据库中的一个列被创建为varchar(0) 而不是varchar(20)

我预计我会收到 0 长度字符串字段的错误,但我没有。 varchar(0)char(0) 的目的是什么,因为无论如何我都无法在此列中存储任何数据。

【问题讨论】:

  • 您使用的是什么 DBMS?
  • @FreshPrinceOfSO 这个具体案例是 mysql - 更新问题。
  • 你为什么认为它必须是合法的?
  • @Wooble 我没有问任何关于法律的问题。很明显,这是合法的。我在问这样做的目的是什么。
  • MySQL 以不符合 SQL 标准而闻名。

标签: mysql sql sqldatatypes


【解决方案1】:

SQL-92 标准不允许这样做,但在 MySQL 中是允许的。来自MySQL manual

MySQL 允许您创建CHAR(0) 类型的列。当您必须与依赖于列的存在但实际上不使用其值的旧应用程序兼容时,这主要是有用的。 CHAR(0) 在您需要一个只能取两个值的列时也非常好:定义为 CHAR(0) NULL 的列只占用一位,并且只能取值 NULL''(空字符串)。

【讨论】:

    【解决方案2】:

    刚刚检查了 MySQL,它确实允许零长度的 CHAR 和 VARCHAR。

    并不是说它非常有用,但我可以想到一种情况,当您不再需要列时将其截断为 0 长度,但您不想破坏在那里写入内容的现有代码。您分配给长度为 0 的列的任何内容都将被截断并发出警告,但警告不是错误,它们不会破坏任何内容。

    【讨论】:

    • 那为什么不删除那一栏呢?我认为删除该列可能需要更改应用程序的代码...
    • 我已经告诉过“你不想破坏在那里写东西的现有代码”
    • 我有同样的猜测,所以我+你的答案,如果你愿意,我想在你的答案中添加这一行。
    • 允许它,它只是抛出一个警告并根据你的 SQL 模式截断值。
    【解决方案3】:

    由于它们是相似的类型,charvarchar,我大胆猜测varchar(0) 的用例与char(0) 相同。

    来自String Types的文档:

    MySQL 允许您创建 CHAR(0) 类型的列。这很有用 主要是当您必须与旧应用程序兼容时 取决于列的存在,但实际上并不使用它 价值。 CHAR(0) 当你需要一个可以取的列时也很好 只有两个值:定义为 CHAR(0) NULL 的列占用 只有一位,只能取值 NULL 和 ''(空 字符串)。

    【讨论】:

      【解决方案4】:

      如果您想在表中标记一个特定的行(例如,因为它用作默认值),它与唯一索引结合使用非常有用。唯一索引确保所有其他行都必须是 null,因此您始终可以按该列检索行。

      【讨论】:

        【解决方案5】:

        您可以使用它来存储布尔值。

        看这段代码:

        mysql> create table chartest(a char(0));
        Query OK, 0 rows affected (0.26 sec)
        
        mysql> insert into chartest value(NULL);
        Query OK, 1 row affected (0.01 sec)
        
        mysql> insert into chartest value('');
        Query OK, 1 row affected (0.00 sec)
        
        mysql> select 'true' from chartest where a is null;
        +------+
        | true |
        +------+
        | true |
        +------+
        1 row in set (0.00 sec)
        
        mysql> select 'false' from chartest where a is not null;
        +-------+
        | false |
        +-------+
        | false |
        +-------+
        1 row in set (0.00 sec)
        

        我们可以用NULL代表真,用''(空字符串)代表false

        根据MySQL参考手册,只有NULL占用一位。

        【讨论】:

          猜你喜欢
          • 2012-08-20
          • 2018-03-04
          • 2018-06-13
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          相关资源
          最近更新 更多