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;
  2. greatsql> CREATE TABLE t1(id INT, c1 VARCHAR(10));
  3. greatsql> INSERT INTO t1 VALUES (1,''), (2,NULL), (3,'str'), (4,'NULL');
  4. greatsql> SELECT id, c1, HEX(c1) FROM t1;
  5. +------+------+----------+
  6. | id | c1 | HEX(c1) |
  7. +------+------+----------+
  8. | 1 | | |
  9. | 2 | NULL | NULL |
  10. | 3 | str | 737472 |
  11. | 4 | NULL | 4E554C4C |
  12. +------+------+----------+
  13. 4 rows in set (0.00 sec)
  14. -- COUNT()不统计NULL
  15. greatsql> SELECT COUNT(*), COUNT(c1) FROM t1;
  16. +----------+-----------+
  17. | count(*) | count(c1) |
  18. +----------+-----------+
  19. | 4 | 3 |
  20. +----------+-----------+
  21. 1 row in set (0.00 sec)
  22. greatsql> SET sql_mode = EMPTYSTRING_EQUAL_NULL;
  23. greatsql> SELECT id, c1, HEX(c1) FROM t1;
  24. +------+------+----------+
  25. | id | c1 | HEX(c1) |
  26. +------+------+----------+
  27. | 1 | NULL | NULL |
  28. | 2 | NULL | NULL |
  29. | 3 | str | 737472 |
  30. | 4 | NULL | 4E554C4C |
  31. +------+------+----------+
  32. 4 rows in set (0.00 sec)
  33. greatsql> SELECT COUNT(*), COUNT(c1) FROM t1;
  34. +----------+-----------+
  35. | count(*) | count(c1) |
  36. +----------+-----------+
  37. | 4 | 2 |
  38. +----------+-----------+
  39. 1 row in set (0.00 sec)

开启 EMPTYSTRING_EQUAL_NULL 模式后,有几个注意事项:

    1. 不允许为空的字段更新为''时,本应报错,但在该模式下只报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
  6. -- 加上STRIC模式后更新失败
  7. greatsql> SET sql_mode = 'EMPTYSTRING_EQUAL_NULL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
  8. greatsql> UPDATE t1 SET c1 = '' WHERE id = 3;
  9. ERROR 1048 (23000): Column 'c1' cannot be null
    1. 会影响部分性能,因为需要对数据内容进行具体转换判断是否为空串,影响处理速度。
    1. 某些语句需要根据实际使用场景进行手动修改,例如:SELECT * FROM t1 WHERE name =''; 语句要修改为 SELECT * FROM t1 WHERE name IS NULL 二者才能等价。
    1. 某些非空字段前期已经写入空串数据,此时查询或使用该字段时其空串会转为NULL。

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx