varchar(0)的目的是什么

时间:2014-02-04 14:43:01

标签: mysql sql sqldatatypes

我最近遇到了数据库创建脚本中的拼写错误导致的问题,即数据库中的列创建为varchar(0)而不是varchar(20)

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

5 个答案:

答案 0 :(得分:10)

根据SQL-92标准不允许,但在MySQL中允许。来自MySQL manual

  

MySQL允许您创建CHAR(0)类型的列。当您必须符合依赖于列的存在但实际上不使用其值的旧应用程序时,这非常有用。当您需要一个只能包含两个值的列时,CHAR(0)也非常好:定义为CHAR(0)的列只占用一位,只能使用值NULL和{ {1}}(空字符串)。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

来自String Types的文档:

  

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

看一下这段代码:

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占一位。