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


MySQL 8.4 C API 开发者指南  /  ...  /  mysql_real_escape_string()

5.4.60 mysql_real_escape_string()

unsigned long
mysql_real_escape_string(MYSQL *mysql,
                         char *to,
                         const char *from,
                         unsigned long length)

说明

此函数创建一个合法的 SQL 字符串,用于 SQL 语句中。请参阅 字符串字面量

注意

如果启用了 NO_BACKSLASH_ESCAPES SQL 模式,则 mysql_real_escape_string() 将失败并产生 CR_INSECURE_API_ERR 错误。在这种情况下,该函数无法转义引号字符,除非将它们加倍,并且要正确执行此操作,它必须了解有关引用上下文的更多信息,而这些信息是不可用的。请改用 mysql_real_escape_string_quote(),它接受一个额外的参数来指定引用上下文。

mysql 参数必须是一个有效的、打开的连接,因为字符转义取决于服务器使用的字符集。

from 参数中的字符串将被编码以生成转义的 SQL 字符串,并考虑连接的当前字符集。结果将放在 to 参数中,后面跟着一个终止空字节。

编码的字符是 \'"NUL (ASCII 0)、\n\r 和 Control+Z。严格来说,MySQL 只要求转义反斜杠和用于在查询中引用字符串的引号字符。mysql_real_escape_string() 会引用其他字符,以便在日志文件中更容易阅读。为了进行比较,请参阅 字符串字面量 中的字面量字符串的引用规则和 QUOTE() SQL 函数,以及 字符串函数和运算符

from 指向的字符串必须是 length 字节长。您必须分配至少 length*2+1 字节长的 to 缓冲区。(在最坏的情况下,每个字符可能需要使用两个字节进行编码,并且必须有空间存放终止空字节。)当 mysql_real_escape_string() 返回时,to 的内容是一个以空字符结尾的字符串。返回值是编码字符串的长度,不包括终止空字节。

如果必须更改连接的字符集,请使用 mysql_set_character_set() 函数,而不是执行 SET NAMES(或 SET CHARACTER SET)语句。mysql_set_character_set() 的工作方式类似于 SET NAMES,但也会影响 mysql_real_escape_string() 使用的字符集,而 SET NAMES 则不会。

示例

以下示例将两个转义字符串插入到 INSERT 语句中,每个字符串都包含在单引号字符内

char query[1000],*end;

end = my_stpcpy(query,"INSERT INTO test_table VALUES('");
end += mysql_real_escape_string(&mysql,end,"What is this",12);
end = my_stpcpy(end,"','");
end += mysql_real_escape_string(&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 参数中的编码字符串的长度,不包括终止空字节,如果发生错误,则返回 -1。

因为 mysql_real_escape_string() 返回一个无符号值,所以您可以通过将返回值与 (unsigned long)-1(或与等效的 (unsigned long)~0)进行比较来检查 -1。

错误