【发布时间】:2019-06-25 12:20:58
【问题描述】:
我不明白这种行为,希望有人能启发我......
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 之间行为的 变化 感到困惑。
这是关于“mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper”以及“mysql Ver 8.0.12 for macos10.13 on x86_64 (MySQL Community Server - GPL)”。它显示在 MySQL 命令行上,如此处所示,以及通过 PDO。
与往常一样,如果这个问题在其他地方得到解决,我深表歉意。我找到了manyrelatedissues,但没有一个解决这个不一致的问题(或者对于Bug 87722,它声称已经修复,但似乎没有)。
【问题讨论】:
-
data的字符编码是什么?这取决于您的服务器设置。您可以使用SHOW CREATE TABLE test找出UTF-8 中\u0080以上的任何内容都是无效的,除非构造正确。该范围内的单个字节始终无效。 -
我正在寻找那个命令!谢谢。它说“DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci”。但这里的奇怪之处在于我只是想在这些字段中输入直接文本:实际的反斜杠 (0x5C)、小写的 u (0x75)、一些数字 (0x30-39)。哪个 MySQL 正确处理反斜杠、u、零、零、零 (5C75303030);但由于某种原因,它对反斜杠、u、零、零、八的解释不同。
标签: mysql