烦恼一般都是想太多了。

0%

偶尔遇到MySQL几个BUG似的地方

今天在删除和查询数据的时候,发现了几个以前没有注意的地方。我有一列值,里面有 NULL,有字符值。然后我用 != 字符这样的情况去居然过滤不出来。

字符比较

CREATE TABLE a(a INT AUTO_INCREMENT, b CHAR(20) DEFAULT NULL, PRIMARY KEY (`a`));

INSERT INTO a(`b`) VALUES ('and'),('or'),('but'),(NULL);

select * from a where b != 'and';

NULL 值的行居然没有出来,这是为什么?

官方文档说明:NULL意味着 一个不存在的,未知的值,所以和其他值有所不同。

需要用 IS NULL 或者 IS NOT NULL 来测试 。任何数学上的比较都没有效比如:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+

其返回值,都是NULL。

0 和 NULL 意味着 false,其他值都表示 true。对一个布尔操作默认 trueth 值是 1。

应该说,字符比较也返回 NULL。

mysql> SELECT '1' = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+

多表删除

另外一个问题是我用类似

delete a from t1 a, t2 b where a.id = b.id;

这个语句会报错,表示找不到 表 a 。

这就是一个问题:

在多表删除中,我们删除表只能使用 别名, 而不能用我们引用的表的名称。