乐趣区

关于后端:MySQL的字符转义

<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 多平台公布

退出移动版