MySQL的NO_BACKSLASH_ESCAPES

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 官方说明: https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html 相关资料: https://dev.
官方说明:
https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html
相关资料:
https://dev.mysql.com/worklog/task/?id=8077


从MySQL 5.7.6版本开始,如果启用了NO_BACKSLASH_ESCAPES,
则mysql_real_escape_string()函数失败,错误码为CR_INSECURE_API_ERR,
这个时候应当使用mysql_real_escape_string_quote()替代mysql_real_escape_string()。


启用NO_BACKSLASH_ESCAPES,表示将反斜杠当作普通字符,而不是转义字符:
SET sql_mode='NO_BACKSLASH_ESCAPES';


查看当前的SQL模式:
mysql> SELECT @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.01 sec)


未启用NO_BACKSLASH_ESCAPES前(反斜杠为转义字符):
mysql> SELECT '\\'\G;
*************************** 1. row ***************************
\: \
1 row in set (0.00 sec)


在启用NO_BACKSLASH_ESCAPES后(反斜杠为普通字符):
mysql> SET sql_mode='NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT '\\'\G;
*************************** 1. row ***************************
\\: \\
1 row in set (0.00 sec)


mysql> SELECT '\"'\G;
*************************** 1. row ***************************
\": \"
1 row in set (0.00 sec)


相关源代码:
#define CR_INSECURE_API_ERR 2062


测试代码(https://github.com/eyjian/mooon/blob/master/mooon/tools/mysql_escape_test.cpp):
try
{
    // 未启用NO_BACKSLASH_ESCAPES
    printf("%s\n", mysql.escape_string(argv[2]).c_str());


    // 启用NO_BACKSLASH_ESCAPES
    mysql.update("%s", "SET sql_mode='NO_BACKSLASH_ESCAPES'");
    printf("%s\n", mysql.escape_string(argv[2]).c_str());
}
catch (mooon::sys::CDBException& ex)
{
    fprintf(stderr, "%s\n", ex.str().c_str());
}


运行结果:
# ./mysql_escape_test 'root@127.0.0.1:3306' '0x1a' 
MYSQL_SERVER_VERSION: 5.7.12
0x1a
db_exception://[2062]Insecure API function call: 'mysql_real_escape_string' Use instead: 'mysql_real_escape_string_quote'@/data/X/mooon/src/sys/mysql_db.cpp:166


mysql_real_escape_string_quote函数(MySQL 5.7.6引入):
unsigned long mysql_real_escape_string_quote(MYSQL *mysql, char *to, const char *from, unsigned long from_length, char quote);
返回值:被转后的长度
参数to:被转后的
参数from:被转前的
参数length:from的有效字符数,不包括结尾符
参数quote:需要处理的字符,如:\, ', ", NUL (ASCII 0), \n, \r

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 Exists
【8月更文挑战第11天】
1214 0
在 MySQL 中使用 Exists
|
Web App开发 前端开发 JavaScript
reveal.js实现html播放ppt的炫酷效果
演示地址: http://meiyouwumai.github.io/reveal/<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>reveal.js - The HTML Presentation Framework<
2819 0
|
机器学习/深度学习 Linux Windows
linux、windows下查看NVIDIA显卡显存使用率
做深度学习时,查看当前任务的使用率可以有效地进行实验 在linux中,命令行输入nvidia-smi指令即可看到当前nvidia显卡的使用情况 在window中,同样也是nvidia-smi.
5297 0
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(三十四)(3)
SqlAlchemy 2.0 中文文档(三十四)
135 0
|
传感器 Go 智能硬件
使用Golang开发硬件驱动
使用Golang开发硬件驱动
pom中读取配置文件的配置字段
pom中读取properties或者yaml属性,打包时输出文件加上日期后缀
881 0
|
12月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
JSON API 数据格式
Elasticsearch 指南 [7.0] - Document APIs 文档接口
Elasticsearch 指南 [7.0] - Document APIs 文档接口
4160 0
|
Unix Shell Python
使用 pyenv 搭建任意 python 环境
使用 pyenv 搭建任意 python 环境
562 0