首页 > 解决方案 > \n 不能发布到 MYSQL 服务器

问题描述

我正在尝试获取、发布 JSON 数据并将其放入使用 utf8 作为字符集的 MYSQL 服务器(docker 容器)。在此 JSON 数据中是应包含“\n”的字符串。当在我的应用程序中应用数据时,这些“\n”会导致换行符,这正是我想要的。

但是,当我尝试将其插入我的数据库时,它会引发错误:“第 x 行的错误 3140 (22032):“无效的 JSON 文本:“字符串中的无效编码。”。

我发现的解决方案建议添加额外的反斜杠(“'\'\n”)。虽然这适用于插入,但它不允许在我的应用程序中使用我想要的换行符。有没有办法在不改变应用程序的情况下解决?

SQL查询:

INSERT INTO table (id, json) VALUES (1,'{"data": "name: ab \n cost: 5 $ | time: 1 s"}')

标签: mysqljsonutf-8

解决方案


INSERT INTO table (id, json) VALUES (1,'{"data": "name: ab \n cost: 5 $ | time: 1 s"}')

\n是 SQL 中的转义序列,因此您发送的是实际的回车符,而不是后跟字母 n 的反斜杠,这是 JSON 所要求的。这个其他查询更明显:

mysql> select '{"data": "name: ab \n cost: 5 $ | time: 1 s"}' as test;
+----------------------------------------------+
| test                                         |
+----------------------------------------------+
| {"data": "name: ab
 cost: 5 $ | time: 1 s"} |
+----------------------------------------------+
1 row in set (0.00 sec)

要在 MySQL 中插入文字\,您需要使用另一个转义\

mysql> select 'one\\ntwo' as test;
+----------+
| test     |
+----------+
| one\ntwo |
+----------+
1 row in set (0.00 sec)

请注意,这仅是您在代码中键入文字字符串时出现的问题。它不会影响来自其他来源的数据(例如 HTML 表单或数据库),除非您无法在某处处理它(例如通过将其注入原始 SQL 而不是使用准备好的语句)。


推荐阅读