我最近遇到了数据库创建脚本中的拼写错误导致的问题,即数据库中的列创建为varchar(0)
而不是varchar(20)
。
我预计我会为0长度字符串字段出错,但我没有。 varchar(0)
或char(0)
的目的是什么,因为无论如何我都无法在此列中存储任何数据。
答案 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)
由于它们是类似的类型,char
和varchar
,我冒昧地猜测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
占一位。