MYSQL 编程之字符转义篇
2015-11-23 19:26
696 查看
数据入库时,我们需要对字符串和二进制类型的数据进行转义。主要的目的是转义一些特殊字符,比如 \0、'、"、\n 等等,让 sql 语句得以正确执行,同时也能起到防止 sql 注入的作用。
参数 to 的长度最少为:length*2+1。因为最坏的情况下每个字节都需要转义,再加上最后的 \0 。
返回转义后字符串的长度,不包括 \0 。
答案是肯定的。
考察 mysql_real_escape_string 的源码实现,会发现它只使用了数据库连接的编码属性,而且没有对其它任何属性做任何判断和处理,这个过程中也不会发生网络数据传输和重连等阻塞操作。
即便该连接在数据库操作线程中发生重连,连接对象也只是被赋值而不是被销毁,而且赋值前后编码属性一致。(参考源码中 mysql_reconnect 的实现)
函数原型
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
参数 to 的长度最少为:length*2+1。因为最坏的情况下每个字节都需要转义,再加上最后的 \0 。
返回转义后字符串的长度,不包括 \0 。
示例
MYSQL *handler = ::mysql_init(nullptr); ::mysql_options(handler, MYSQL_SET_CHARSET_NAME, "utf8"); // 指定编码 ::mysql_real_connect(...); const char *from = "待转义字符串"; int length = strlen(from); char *to = new char[length*2+1]; ::mysql_real_escape_string(handler, to, from, length); // 转义
服务端编程
由于查询操作会阻塞执行线程,因此在服务端编程中逻辑线程通常只负责拼接 sql 语句,然后将其发送给数据库操作线程等待执行。这就意味着转义和查询发生在不同线程,那么它们能共享同一个连接呢?答案是肯定的。
考察 mysql_real_escape_string 的源码实现,会发现它只使用了数据库连接的编码属性,而且没有对其它任何属性做任何判断和处理,这个过程中也不会发生网络数据传输和重连等阻塞操作。
即便该连接在数据库操作线程中发生重连,连接对象也只是被赋值而不是被销毁,而且赋值前后编码属性一致。(参考源码中 mysql_reconnect 的实现)
其它
有一种方式避免转义,具体参考:Prepared Statements。相关文章推荐
- windows 下MySQL服务名无效
- mysql的jdbc中的编码转换
- debian下mysql安装与配置
- MySQL-5.6.26免安装版配置方法
- Hibernate 总结2:配置方法
- MySQL空间查询(Geometry类)
- MySQL因非正常关机的情况下,导致无法正常启动的临时解决办法
- MySQL编程。sql语句。
- Mysql中字段大小写敏感问题
- MySQL Study之--MySQL 表连接
- MySQL Study之--MySQL 表连接
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- MYSQL 常用查詢
- mysql命令行下将数据导出成excel文件
- mysql数据库操作缓慢,原来是字段的内容过长导致的,看来cache很有用.报错:Lock wait timeout exceeded; try restarting transaction
- MySQL索引的查看创建和删除
- mysql 执行alter语句
- windows下Mysql免安装版配置
- mysql中char与varchar的区别分析
- mac mysql(5.6.27) 中文乱码