我不了解这种行为,希望有人能启发我...
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,它声称已经修复,但似乎不是固定的。) >
答案 0 :(得分:2)
由于在此处进行了两层转义,即SQL和JSON,因此实际上您需要加倍反斜杠才能使其起作用:
INSERT INTO test(data) VALUES ('["\\\\u0000\"]'), ('["\\\\u0001"]'), ('["\\\\u0081"]'), ('["\\\\u0091"]');
请注意,这不是必要的,如果这些是简单的VARCHAR
字段。 JSON将\
视为特殊字符。