mysql - 当 NULL 在 MySQL 中不是 NULL

标签 mysql sql

我有一个从 Access 导入的数据库,其中有几列显示了一些异常行为。特定列的类型为 datetime,允许 NULL 值。原始数据集有一些带有日期的行,一些带有空值,我试图选择所有没有日期的行(IS NULL)并且总是返回“空集”。请原谅可怕的列名,长话短说,并查看带有三个字段 PK 的缩写表,然后是有问题的列:

+-----------------------------------------+-------------+------+-----+---------+
| Field                                   | Type        | Null | Key | Default |
+-----------------------------------------+-------------+------+-----+---------+
| HID                                     | varchar(50) | NO   | PRI | NULL    |
| yr                                      | varchar(50) | NO   | PRI | NULL    |
| mo                                      | varchar(50) | NO   | PRI | NULL    |
| wanem deit yu yu risivim ol meresin     | datetime    | YES  |     | NULL    |

对它运行一个简单的查询会得出以下结果:

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" IS NOT NULL LIMIT 5;
+-----+------+----+-------------------------------------+
| hid | yr   | mo | wanem deit yu yu risivim ol meresin |
+-----+------+----+-------------------------------------+
| 109 | 2010 | 01 | NULL                                |
| 109 | 2011 | 03 | NULL                                |
| 109 | 2012 | 01 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 02 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 03 | NULL                                |
+-----+------+----+-------------------------------------+
5 rows in set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" IS NULL LIMIT 5;
Empty set (0.00 sec)

非常奇怪的行为,所以我想它可能是一个字符串,这要归功于可能有错误的导入,所以我打破了书中的每条规则,尝试以下操作,但没有什么能让我得到以 NULL 分隔的行来自有值(value)观的人。

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = "NULL" LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = NULL LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = 0 LIMIT 5;
+-----+------+----+-------------------------------------+
| hid | yr   | mo | wanem deit yu yu risivim ol meresin |
+-----+------+----+-------------------------------------+
| 109 | 2010 | 01 | NULL                                |
| 109 | 2011 | 03 | NULL                                |
| 109 | 2012 | 01 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 02 | 2011-11-11 00:00:00                 |
| 109 | 2012 | 03 | NULL                                |
+-----+------+----+-------------------------------------+
5 rows in set, 1 warning (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = "" LIMIT 5;
Empty set (0.00 sec)

mysql> SELECT hid, yr, mo, `wanem deit yu yu risivim ol meresin` FROM AP WHERE "wanem deit yu yu risivim ol meresin" = '' LIMIT 5;
Empty set (0.00 sec)

所以我有点难过。我找到了许多关于“我如何选择空值”的其他 stackoverflow 文章,但没有一篇文章在“IS NOT NULL”如此奇怪地返回其中包含 NULL 的行(并且 IS NULL 每次都返回一个空集)。

最佳答案

尝试在 where 子句中使用反引号而不是双引号,因为它是字段名

SELECT hid,
       yr,
       mo,
       `wanem deit yu yu risivim ol meresin`
FROM AP
WHERE `wanem deit yu yu risivim ol meresin` IS NULL LIMIT 5;

实际上下面的查询不会检查 NOT NULLwhere 条件,这就是为什么它将查询后的所有记录更改返回为反引号而不是双引号

SELECT hid,
       yr,
       mo,
       `wanem deit yu yu risivim ol meresin`
FROM AP
WHERE `wanem deit yu yu risivim ol meresin` IS NOT NULL LIMIT 5;

关于mysql - 当 NULL 在 MySQL 中不是 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24236381/

相关文章:

php - 使用 PHP 更新 MySQL

mysql - WHERE 子句中的条件顺序会影响 MySQL 性能吗?

mysql - 如何将两个 ID 列与 MySQL 中的另一个表连接起来?

mysql - 通过减去一个值来更新列

c++ - 将 SQL 连接到 visual studio 2015 中的 c++ 项目

mysql - InnoDB 的 LOAD INDEX INTO CACHE 替代品? MySQL

c# - 如何显示数据库 ASP.Net 中的特定行记录?

不使用 View 的 MySQL 语句求列的总和和百分比

sql - 优化 LATERAL join 中的慢聚合

mysql - 如何在对话 View 中获取消息?