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.