您的位置:首页 > 数据库 > MySQL

MYSQL 编程之字符转义篇

2015-11-23 19:26 696 查看
数据入库时,我们需要对字符串和二进制类型的数据进行转义。主要的目的是转义一些特殊字符,比如 \0、'、"、\n 等等,让 sql 语句得以正确执行,同时也能起到防止 sql 注入的作用。

函数原型

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: