可空列的行为并非如此
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 会将其设置为空字符串而不是返回错误? 是的,规则很古怪。以上是关于可空列的行为并非如此的主要内容,如果未能解决你的问题,请参考以下文章