我最近遇到了一个由数据库创建脚本中的拼写错误引起的问题,数据库中的列被创建为
varchar(0)
而不是varchar(20)
。
我预计我会收到 0 长度字符串字段的错误,但我没有。
varchar(0)
或 char(0)
的目的是什么,因为无论如何我都无法在此列中存储任何数据。
刚刚查了一下MySQL,确实允许零长度的CHAR和VARCHAR。
并不是说它非常有用,但我可以想到一种情况,当您不再需要列时将其截断为 0 长度,但您不想破坏在那里写入内容的现有代码。您分配给 0 长度列的任何内容都将被截断并发出警告,但警告不是错误,它们不会破坏任何内容。
由于它们是相似的类型,
char
和varchar
,我大胆猜测varchar(0)
的用例与char(0)
相同。
来自字符串类型的文档:
MySQL 允许您创建 CHAR(0) 类型的列。这很有用 主要是当您必须兼容旧的应用程序时 依赖于列的存在但实际上并不使用它 价值。当您需要一个可以接受的列时,CHAR(0) 也非常好 只有两个值:定义为 CHAR(0) NULL 的列占用 只有一位,并且只能取值 NULL 和 '' (空的 字符串)。
如果您想标记表中的一个特定行(例如,因为它作为默认行),那么它与唯一索引结合使用非常有用。唯一索引确保所有其他行都必须是
null
,因此您始终可以按该列检索行。
您可以使用它来存储布尔值。
看这段代码:
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
来表示 true,用 ''(空字符串)来表示 false
!
根据MySQL参考手册,只有
NULL
占用一位。
您可能最终得到
VARCHAR(0)
的另一个原因是,如果您使用 LOAD DATA INFILE
从 CSV 加载数据,并且您的脚本会解析 CSV 的字段大小,以根据数据的大小配置新的 MySQL 表。
您可以跳过没有数据的列,但如果您想在 MySQL 中准确表示 CSV,那么将空字段设置为零长度是最有效的。