varchar(0)的用途是什么

问题描述 投票:0回答:6

我最近遇到了一个由数据库创建脚本中的拼写错误引起的问题,数据库中的列被创建为

varchar(0)
而不是
varchar(20)

我预计我会收到 0 长度字符串字段的错误,但我没有。

varchar(0)
char(0)
的目的是什么,因为无论如何我都无法在此列中存储任何数据。

mysql sql sqldatatypes
6个回答
16
投票

SQL-92 标准不允许这样做,但在 MySQL 中允许。来自MySQL手册

MySQL 允许您创建

CHAR(0)
类型的列。这主要在您必须遵守依赖于列的存在但实际上并不使用其值的旧应用程序时非常有用。当您需要一个只能接受两个值的列时,
CHAR(0)
也非常好:定义为
CHAR(0)
NULL 的列仅占用一位,并且只能接受值
NULL
''
(空字符串) ).


6
投票

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

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


3
投票

由于它们是相似的类型,

char
varchar
,我大胆猜测
varchar(0)
的用例与
char(0)
相同。

来自字符串类型的文档:

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


0
投票

如果您想标记表中的一个特定行(例如,因为它作为默认行),那么它与唯一索引结合使用非常有用。唯一索引确保所有其他行都必须是

null
,因此您始终可以按该列检索行。


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
来表示 true,用 ''(空字符串)来表示
false

根据MySQL参考手册,只有

NULL
占用一位。


0
投票

您可能最终得到

VARCHAR(0)
的另一个原因是,如果您使用
LOAD DATA INFILE
从 CSV 加载数据,并且您的脚本会解析 CSV 的字段大小,以根据数据的大小配置新的 MySQL 表。

您可以跳过没有数据的列,但如果您想在 MySQL 中准确表示 CSV,那么将空字段设置为零长度是最有效的。

© www.soinside.com 2019 - 2024. All rights reserved.