可空列的行为并非如此

Posted

技术标签:

【中文标题】可空列的行为并非如此【英文标题】:Nullable column not behaving as such 【发布时间】:2017-11-08 22:42:13 【问题描述】:

我有一个表 actor,其中有一个可以为空的列 first_name。我将特定行设置为空:

update actor set first_name=null where actor_id=201;
Query OK, 1 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

然后我尝试使用 where 子句中的 null 值查询该表,但什么也得不到:

select * from actor where first_name is null;
Empty set (0.00 sec)

但是如果我选择检查该列是否为空字符串,我会得到正确的值:

select * from actor where first_name = '';
[...]
1 row in set (0.00 sec)

存储引擎是 MyISAM。为什么将空列设置为空字符串?

更新

我看到了 1 个警告,但 mysql CLI 没有显示任何警告。我怎样才能做到这一点?

还有:

desc actor;
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                 | Null | Key | Default           | Extra                       |
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| actor_id    | smallint(5) unsigned | NO   | PRI | NULL              | auto_increment              |
| first_name  | varchar(45)          | NO   |     | NULL              |                             |
| last_name   | varchar(45)          | NO   | MUL | NULL              |                             |
| last_update | timestamp            | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+----------------------+------+-----+-------------------+-----------------------------+

【问题讨论】:

向我们展示show create table actor 声明.. 因为Warnings: 1在那里。所以肯定会提示一些错误。 请注意您的查询update actor set first_name=null where actor_id=201; 产生了一个警告。Query OK, 1 rows affected, 1 warning 也请向我们展示带有 SHOW WARNINGS 的警告; 【参考方案1】:

从表描述来看,包括 first_name 在内的所有列似乎都不为空。您确定它是可为空的列吗?

【讨论】:

我正在查看默认值,所以您可能是对的。那么更新为 null 会将其设置为空字符串而不是返回错误? 是的,规则很古怪。

以上是关于可空列的行为并非如此的主要内容,如果未能解决你的问题,请参考以下文章

当所述列的值为 NULL 时,我在可空列上使用 JSON_extract 函数的 where 语句得到确认?

如何在 oracle 中使可空列不为空

csharp Linq加入多个可空列

通过比较可空列连接三个表

检查可空列是不是稀疏或不在 SQL Server 中查询

过度使用数据库中的可空列是“代码异味”吗?