unsigned long
mysql_real_escape_string_quote(MYSQL *mysql,
char *to,
const char *from,
unsigned long length,
char quote)
此函数创建一个合法的 SQL 字符串,用于 SQL 语句中。请参见 字符串字面量.
mysql
参数必须是有效的、打开的连接,因为字符转义取决于服务器使用的字符集。
from
参数中的字符串被编码以生成一个转义的 SQL 字符串,并考虑连接的当前字符集。结果将放在 to
参数中,后面跟着一个终止的空字节。
被编码的字符是 \
、'
、"
、NUL
(ASCII 0)、\n
、\r
、Control+Z 和 `
。严格来说,MySQL 只要求转义反斜杠和用于在查询中引用字符串的引号字符。mysql_real_escape_string_quote()
将其他字符引起来,以便在日志文件中更容易阅读。为了比较,请参见字面量字符串的引号规则以及 QUOTE()
SQL 函数,如 字符串字面量 和 字符串函数和运算符 中所述。
如果启用了 ANSI_QUOTES
SQL 模式,则 mysql_real_escape_string_quote()
不能用于转义双引号字符,以便在双引号标识符内使用。(该函数无法判断是否启用了该模式以确定正确的转义字符。)
from
指向的字符串必须是 length
字节长。您必须分配 to
缓冲区,使其至少为 length*2+1
字节长。(在最坏的情况下,每个字符可能需要使用两个字节进行编码,并且必须有空间容纳终止的空字节。)当 mysql_real_escape_string_quote()
返回时,to
的内容是一个以空结尾的字符串。返回值是编码字符串的长度,不包括终止的空字节。
quote
参数指示要放置转义字符串的上下文。假设您打算转义 from
参数并将转义后的字符串(此处指定为 str
)插入以下语句之一
1) SELECT * FROM table WHERE name = 'str'
2) SELECT * FROM table WHERE name = "str"
3) SELECT * FROM `str` WHERE id = 103
为了对每个语句正确地执行转义,请按以下方式调用 mysql_real_escape_string_quote()
,其中最后一个参数指示引号上下文
1) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'\'');
2) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'"');
3) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'`');
如果您必须更改连接的字符集,请使用 mysql_set_character_set()
函数,而不是执行 SET NAMES
(或 SET CHARACTER SET
)语句。 mysql_set_character_set()
的工作方式类似于 SET NAMES
,但还会影响 mysql_real_escape_string_quote()
使用的字符集,而 SET NAMES
不会。
以下示例将两个转义后的字符串插入到一个 INSERT
语句中,每个字符串都在单引号字符内
char query[1000],*end;
end = my_stpcpy(query,"INSERT INTO test_table VALUES('");
end += mysql_real_escape_string_quote(&mysql,end,"What is this",12,'\'');
end = my_stpcpy(end,"','");
end += mysql_real_escape_string_quote(&mysql,end,"binary data: \0\r\n",16,'\'');
end = my_stpcpy(end,"')");
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
示例中使用的 my_stpcpy()
函数包含在 libmysqlclient
库中,其工作方式类似于 strcpy()
,但返回指向第一个参数的终止空位的指针。