Oracle兼容-语法-空串’’与NULL等价模式
1. 语法
1. SET GLOBAL|SESSION sql_mode = EMPTYSTRING_EQUAL_NULL;
2. 定义和用法
在启用 sql_mode = EMPTYSTRING_EQUAL_NULL 模式后,空字符串 '' 将会被当做 NULL 来处理,但并不等同与 NULL 可以等价于空串 '' 来使用。
开启 EMPTYSTRING_EQUAL_NULL 模式后不仅在做数据比较、统计、等使用的过程中有影响,原有数据空串在查询显示时也会转为 NULL,但不会修改原始存储数据(仅在查询展示时发生变化),如下例所示:
1. greatsql> SET sql_mode = DEFAULT;
3. greatsql> CREATE TABLE t1(id INT, c1 VARCHAR(10));
4. greatsql> INSERT INTO t1 VALUES (1,''), (2,NULL), (3,'str'), (4,'NULL');
5. greatsql> SELECT id, c1, HEX(c1) FROM t1;
6. +------+------+----------+
7. | id | c1 | HEX(c1) |
8. +------+------+----------+
9. | 1 | | |
10. | 2 | NULL | NULL |
11. | 3 | str | 737472 |
12. | 4 | NULL | 4E554C4C |
13. +------+------+----------+
14. 4 rows in set (0.00 sec)
16. -- COUNT()不统计NULL值
17. greatsql> SELECT COUNT(*), COUNT(c1) FROM t1;
18. +----------+-----------+
19. | count(*) | count(c1) |
20. +----------+-----------+
21. | 4 | 3 |
22. +----------+-----------+
23. 1 row in set (0.00 sec)
25. greatsql> SET sql_mode = EMPTYSTRING_EQUAL_NULL;
26. greatsql> SELECT id, c1, HEX(c1) FROM t1;
27. +------+------+----------+
28. | id | c1 | HEX(c1) |
29. +------+------+----------+
30. | 1 | NULL | NULL |
31. | 2 | NULL | NULL |
32. | 3 | str | 737472 |
33. | 4 | NULL | 4E554C4C |
34. +------+------+----------+
35. 4 rows in set (0.00 sec)
37. greatsql> SELECT COUNT(*), COUNT(c1) FROM t1;
38. +----------+-----------+
39. | count(*) | count(c1) |
40. +----------+-----------+
41. | 4 | 2 |
42. +----------+-----------+
43. 1 row in set (0.00 sec)
开启 EMPTYSTRING_EQUAL_NULL 模式后,有几个注意事项:
-
- 不允许为空的字段更新为
''时,本应报错,但在该模式下只报WARN且能更新成功。这是因为目前在该模式下不包含严格模式,可以手动加上严格模式加以限制。
- 不允许为空的字段更新为
1. -- 在EMPTYSTRING_EQUAL_NULL模式下可更新成功
2. greatsql> SET sql_mode = EMPTYSTRING_EQUAL_NULL;
3. greatsql> UPDATE t1 SET c1 = '' WHERE id = 4;
4. Query OK, 1 row affected, 1 warning (0.00 sec)
5. Rows matched: 1 Changed: 1 Warnings: 1
7. -- 加上STRIC模式后更新失败
8. greatsql> SET sql_mode = 'EMPTYSTRING_EQUAL_NULL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
9. greatsql> UPDATE t1 SET c1 = '' WHERE id = 3;
10. ERROR 1048 (23000): Column 'c1' cannot be null
-
- 会影响部分性能,因为需要对数据内容进行具体转换判断是否为空串,影响处理速度。
-
- 某些语句需要根据实际使用场景进行手动修改,例如:
SELECT * FROM t1 WHERE name ='';语句要修改为SELECT * FROM t1 WHERE name IS NULL二者才能等价。
- 某些语句需要根据实际使用场景进行手动修改,例如:
-
- 某些非空字段前期已经写入空串数据,此时查询或使用该字段时其空串会转为NULL。
问题反馈
联系我们
扫码关注微信公众号

