文件首頁
MySQL 9.0 C API 開發人員指南
下載本手冊
PDF (美式信紙) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL 9.0 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 的內容會是一個以 null 終止的字串。傳回值是編碼字串的長度,不包括終止空位元組。

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() 類似,但會傳回指向第一個參數終止 null 的指標。

傳回值

放置在 to 引數中的編碼字串長度,不包括終止空位元組。

錯誤

無。