Documentation Home
MySQL 8.0 C API 开发者指南  / 第 5 章 C API 基本接口  / 5.4 C API 基本功能说明  /  5.4.61 mysql_real_escape_string_quote()

5.4.61 mysql_real_escape_string_quote()

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(or 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(),但返回指向第一个参数的终止 null 的指针。

返回值

放入 to参数中的编码字符串的长度,不包括终止空字节。

错误

没有任何。