共计 1414 个字符,预计需要花费 4 分钟才能阅读完成。
<font color=”orange”> 表象 </font>
表构造如下:
其中 content 字段寄存 json 之后的数据, 这个 json 数据外面 extra 字段的内容又是一段 json, 如下:
INSERT INTO `future`.`test_escape_character`
(`id`, `title`, `content`, `is_del`)
VALUES
( 2,
'我的博客',
'{"web_id":31415,"name":" 清澄秋爽 ","extra":"{\"url\":\"https://dashen.tech\",\"web_icon\":\"https://dashen.tech/favicon.ico\",\"desc\":\"苹果树下考虑者 \"}","online":1}',
1 );
写入之后, 复制 content字段, 发现extra 无奈解析了
而将 content字段 {"web_id":31415,"name":"清澄秋爽","extra":"{\"url\":\"https://dashen.tech\",\"web_icon\":\"https://dashen.tech/favicon.ico\",\"desc\":\" 苹果树下考虑者 \"}","online":1}
间接在 navicat 中写入, 则可胜利解析.
比照发现, 能胜利解析的 extra
, 多了\
.(这是 json 中的 json 必须要有的, 起本义"
的作用)
但为何 insert 进去的数据, 就少了这个\
?
即咱们想要保留的是{"web_id":31415,"name":"清澄秋爽","extra":"{\"url\":\"https://dashen.tech\",\"web_icon\":\"https://dashen.tech/favicon.ico\",\"desc\":\" 苹果树下考虑者 \"}","online":1}
, insert 写进去之后, 却成了
{"web_id":31415,"name":"清澄秋爽","extra":"{"url":"https://dashen.tech","web_icon":"https://dashen.tech/favicon.ico","desc":" 苹果树下考虑者 "}","online":1}
<font color=”orange”> 原由 </font>
这个问题是因为 MySQL 的字符串本义 导致.
MySQL 中, 特殊字符用 反斜线 (‘\’)
开始, 从而导致\”url\” 被本义为"url"
, 进而使保留的数据 json 解析失败.
<font color=”orange”> 解决 </font>
解决办法也非常简单, 将用在本义起始的 \
也进行本义即可.
MySQL 用 \\
来本义 反斜线 (‘\’) 字符
, 即在 insert 时, 将 content 字段改为:
'{"web_id":31415,"name":" 清澄秋爽 ","extra":"{\\"url\\":\\"https://dashen.tech\\",\\"web_icon\\":\\"https://dashen.tech/favicon.ico\\",\\"desc\\":\\"苹果树下考虑者 \\"}","online":1}'
这样写入的数据, 就合乎预期了~
更多 MySQL 的转义字符, 可参考
MySql 字符本义
MySQL 中执行 sql 语句反斜杠须要进行本义否则会被吃掉
本文由 mdnice 多平台公布