MySQL的字符转义


表象


表结构如下:

alt

其中 content 字段存放json之后的数据,这个json数据里面 extra 字段的内容又是一段json,如下:

alt
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 );
alt

写入之后,复制 content字段,发现extra 无法解析了

alt

而将 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}


原由


这个问题是因为 MySQL的字符串转义 导致.

MySQL中,特殊字符用 反斜线(‘\’)开始, 从而导致**"url"** 被转义为"url",进而使保存的数据json解析失败.


解决


解决办法也非常简单,将用在转义起始的\也进行转义即可.

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

<think>嗯,用户想了解MySQL转义字符,我需要先回忆一下相关知识。首先,转义字符在SQL中主要是用来处理特殊字符,避免它们被误解为SQL语法的一部分。比如,用户输入中包含引号或者反斜杠时,如果不转义,可能会导致语法错误或者SQL注入攻击。 接下来,我应该先列出MySQL中常见的转义字符。记得反斜杠(\)是默认的转义字符,用来转义单引号、双引号、反斜杠本身等。例如,单引号在字符串中需要写成\',否则会提前结束字符串导致错误。此外,还有一些其他的转义序列,比如\n代表换行,\t代表制表符等等。 然后,可能需要解释一下在字符串中使用转义字符的不同情况,比如在普通字符串和LIKE子句中的区别。在LIKE操作中,百分号(%)和下划线(_)是通配符,如果要搜索这些字符本身,就需要用转义符,这时候可以用ESCAPE关键字指定转义字符,比如ESCAPE '/',这样就可以用/%来匹配百分号。 另外,用户可能想知道如何关闭反斜杠的转义功能,比如在NO_BACKSLASH_ESCAPES模式下,这时候需要用单引号转义单引号,比如写成''两个单引号。这时候需要说明不同的SQL模式对转义的影响,这可能涉及到MySQL的配置,用户可能需要检查他们的SQL模式设置。 还要注意,预处理语句(Prepared Statements)或者参数化查询通常能自动处理转义,避免手动处理带来的错误,这也是防止SQL注入的最佳实践,应该建议用户优先使用这种方法。 可能需要举例说明转义字符的使用场景,比如插入包含单引号的数据,或者LIKE查询中的特殊字符处理。例子能帮助用户更好地理解如何应用这些转义字符。 最后,要确保信息准确,检查是否有遗漏的转义字符,比如双引号、退格符等,以及不同上下文下的使用差异。同时,提醒用户注意SQL注入的问题,强调正确使用转义的重要性,尤其是在动态生成SQL语句时。</think>MySQL转义字符主要用于处理特殊字符的存储和查询,以下是核心知识点: --- ### 一、默认转义字符:反斜杠`\` 在普通字符串中,MySQL使用反斜杠作为转义字符: - `\'` → 单引号(用于单引号包裹的字符串) - `\"` → 双引号(用于双引号包裹的字符串) - `\\` → 反斜杠本身 - `\n` → 换行符 - `\t` → 制表符 - `\b` → 退格符 - `\r` → 回车符 **示例**: ```sql INSERT INTO users (name) VALUES ('O\'Connor'); -- 插入名字 O'Conner SELECT * FROM logs WHERE message LIKE '%\\_temp%'; -- 匹配包含 "_temp" 的内容 ``` --- ### 二、LIKE子句中的通配符转义 在`LIKE`查询中,`%`和`_`是通配符,需用`ESCAPE`自定义转义符: ```sql SELECT * FROM products WHERE name LIKE '%50\%%' ESCAPE '\'; -- 匹配包含 "50%" 的字符串 ``` --- ### 三、禁用反斜杠转义模式 通过`NO_BACKSLASH_ESCAPES`模式可关闭反斜杠转义: ```sql SET sql_mode = 'NO_BACKSLASH_ESCAPES'; INSERT INTO texts (content) VALUES ('单引号需写两次:'''); -- 插入 '单引号需写两次:'' ``` --- ### 四、最佳实践 1. **优先使用参数化查询**(如Prepared Statements)自动处理转义 2. 动态生成SQL时,使用`mysql_real_escape_string()`(C API)或ORM框架的转义方法 3. 警惕SQL注入,永远不要直接拼接用户输入 --- ### 附:常见问题 **Q:如何查询包含反斜杠的数据?** ```sql SELECT * FROM files WHERE path LIKE '%\\\\%'; -- 匹配包含单个反斜杠的路径 ``` **Q:JSON数据中的转义如何处理?** 使用`JSON_UNESCAPED_SLASHES`模式可保留斜杠原始形态: ```sql SELECT JSON_OBJECT('path', 'C:\\data') AS json; -- 输出 {"path": "C:\\data"} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值