MySQL解析\ u0080

时间:2019-01-31 23:25:27

标签: mysql

我不了解这种行为,希望有人能启发我...

mysql> CREATE TABLE test (id INT AUTO_INCREMENT, data JSON, PRIMARY KEY(id));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO test(data) VALUES ('["\\u0000\"]'), ('["\\u0001"]'), ('["\\u0081"]'), ('["\\u0091"]');
Query OK, 4 rows affected (0.09 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select *,char_length(data),hex(data) from test;
+----+------------+-------------------+----------------------+
| id | data       | char_length(data) | hex(data)            |
+----+------------+-------------------+----------------------+
|  1 | ["\u0000"] |                10 | 5B225C7530303030225D |
|  2 | ["\u0001"] |                10 | 5B225C7530303031225D |
|  3 | [""]      |                 5 | 5B22C281225D         |
|  4 | [""]      |                 5 | 5B22C291225D         |
+----+------------+-------------------+----------------------+
4 rows in set (0.00 sec)

为什么MySQL选择将\\ u0081解析为一个代码点,却将\\ u0001保留为一系列简单字符?

或者换一种说法,为什么MySQL在后一种情况下将“ \\”解析为“这是一个文字反斜杠字符”,而在前一种情况下则将“ \\”解析为解释以下字符的原因?我可以看到两种方法的论点,但是我对\ u0001和\ u0081之间行为的 change 感到困惑。

这是在“ MySQL Ver 14.14 Distrib 5.7.22,用于使用EditLine包装程序的Linux(x86_64)”以及“ x86_64上的macOS10.13的MySQL Ver 8.0.12(MySQL社区服务器-GPL)”上。它显示在MySQL命令行上,如此处所示,也可以通过PDO显示。

一如既往,如果在其他地方解决此问题,我深表歉意。我发现many related issues,但是没有一个解决这个不一致的问题(或者对于Bug 87722,它声称已经修复,但似乎不是固定的。) >

1 个答案:

答案 0 :(得分:2)

由于在此处进行了两层转义,即SQL和JSON,因此实际上您需要加倍反斜杠才能使其起作用:

INSERT INTO test(data) VALUES ('["\\\\u0000\"]'), ('["\\\\u0001"]'), ('["\\\\u0081"]'), ('["\\\\u0091"]');

请注意,这不是必要的,如果这些是简单的VARCHAR字段。 JSON将\视为特殊字符。