27.7.6.56 mysql_real_escape_string_quote()
unsigned long mysql_real_escape_string_quote(MYSQL *mysql, char *to, const char *from, unsigned long length, char quote)
Description
此函数创建一个合法的 SQL 字符串以用于 SQL 语句。参见第 9.1.1 节“字符串 Literals”。
mysql
参数必须是有效的开放连接,因为字符转义取决于服务器使用的字符集。
考虑到连接的当前字符集,对from
参数中的字符串进行编码以生成转义的 SQL 字符串。结果放置在to
参数中,后跟一个终止的空字节。
编码的字符是\
,'
,"
,NUL
(ASCII 0),\n
,\r
,Control Z 和```。严格来说,MySQL 只要求转义反斜杠和用于对查询中的字符串加引号的引号字符。 mysql_real_escape_string_quote()引用其他字符以使它们更易于在日志文件中阅读。为了进行比较,请参见 Literals 字符串的引用规则以及第 9.1.1 节“字符串 Literals”和第 12.7 节“字符串函数和运算符”中的QUOTE() SQL 函数。
Note
如果启用了ANSI_QUOTES SQL 模式,则不能使用mysql_real_escape_string_quote()来转义双引号字符以在双引号标识符中使用。 (该函数无法确定是否启用了模式来确定正确的转义字符.)
from
指向的字符串的长度必须为length
个字节。您必须将to
缓冲区分配为至少length*2+1
字节长。 (在最坏的情况下,每个字符可能需要使用两个字节进行编码,并且终止空字节必须有空间.)当mysql_real_escape_string_quote()返回时,to
的内容是一个以空终止的字符串。返回值是编码字符串的长度,不包括终止空字节。
quote
参数指示要在其中放置转义字符串的上下文。假设您打算转义from
参数并将转义的字符串(在此由* str
*table 示)插入以下语句之一:
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(),其中最后一个参数 table 示引用上下文:
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(或设置字符集)语句。 mysql_set_character_set()的工作方式与SET NAMES类似,但也会影响mysql_real_escape_string_quote()使用的字符集,而SET NAMES不会。
Example
下面的示例将两个转义的字符串插入到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()
,但返回指向第一个参数的终止 null 的指针。
Return Values
置于to
参数中的编码字符串的长度,不包括终止空字节。
Errors
None.