文档首页
MySQL 8.4 C API 开发者指南
下载本手册
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL 8.4 C API 开发者指南  /  ...  /  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(或 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(),但返回指向第一个参数的终止空值的指针。

返回值

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

错误

无。