Mysql 什么';这是varchar(0)的用途

Mysql 什么';这是varchar(0)的用途,mysql,sql,sqldatatypes,Mysql,Sql,Sqldatatypes,我最近遇到了一个由数据库创建脚本中的一个输入错误引起的问题,即数据库中的一列被创建为varchar(0),而不是varchar(20) 我原以为0长度字符串字段会出错,但我没有。varchar(0)或char(0)的目的是什么,因为我无论如何都不能在这个列中存储任何数据。标准不允许这样做,但MySQL允许这样做。从: MySQL允许您创建类型为CHAR(0)的列。这主要在您必须兼容依赖于列的存在但实际上不使用其值的旧应用程序时非常有用CHAR(0)也非常好:定义为CHAR(0)NULL的列只占用

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

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

标准不允许这样做,但MySQL允许这样做。从:

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


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

根据以下文件:

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


刚刚检查了MySQL,它确实允许零长度字符和VARCHAR


这并不是说它非常有用,但我可以想到这样一种情况:当不再需要某个列时,将该列截断为0长度,但不希望破坏在该列中编写内容的现有代码。分配给长度为0的列的任何内容都将被截断并发出警告,但警告不是错误,它们不会破坏任何内容。

如果要标记表中的某一特定行(例如,因为它是默认值),与唯一索引结合使用将非常有用。唯一索引确保所有其他行都必须为
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
占用一位。

您使用的是什么数据库管理系统?@FreshPrinceOfSO这个具体案例是MySQL-更新问题。为什么您认为它必须是合法的才有用?@Wooble我没有问任何关于合法的问题。显然,这是合法的。我在问这是为了什么。众所周知,MySQL不符合SQL标准。那么为什么不删除该列呢?我认为删除该列可能需要更改应用程序的代码…我已经告诉过“您不想破坏在那里编写内容的现有代码”我有同样的猜测,所以我+您的答案,我认为如果您愿意,可以在您的答案中添加这一行。如果允许的话,它只是抛出一个警告并根据您的SQL模式截断值。