MySQL 9.0 參考手冊  /  ...  /  字串字面值

11.1.1 字串字面值

字串是以單引號 (') 或雙引號 (") 字元括住的位元組或字元序列。範例:

'a string'
"another string"

相鄰的引號字串會串連成單一字串。下列各行是等效的:

'a string'
'a' ' ' 'string'

如果啟用 ANSI_QUOTES SQL 模式,則字串字面值只能以單引號括住,因為以雙引號括住的字串會被解譯為識別符號。

二進位字串是位元組字串。每個二進位字串都有一個名為 binary 的字元集和定序。非二進位字串是字元字串。它具有 binary 以外的字元集,以及與該字元集相容的定序。

對於這兩種字串類型,比較都是基於字串單位的數值。對於二進位字串,單位是位元組;比較會使用數值位元組值。對於非二進位字串,單位是字元,而且某些字元集支援多位元組字元;比較會使用數值字元碼值。字元碼排序是字串定序的函式。(如需更多資訊,請參閱第 12.8.5 節,〈binary 定序與 _bin 定序的比較〉。)

注意

mysql 用戶端中,二進位字串會使用十六進位標記法顯示,具體取決於 --binary-as-hex 的值。如需關於該選項的更多資訊,請參閱第 6.5.1 節,〈mysql — MySQL 命令列用戶端〉

字元字串字面值可能會有一個選擇性的字元集引導器和 COLLATE 子句,以將其指定為使用特定字元集和定序的字串:

[_charset_name]'string' [COLLATE collation_name]

範例:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8mb4'string' COLLATE utf8mb4_danish_ci;

您可以使用 N'literal' (或 n'literal') 來建立國家字元集中的字串。這些陳述式是等效的:

SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';

如需關於這些字串語法形式的資訊,請參閱第 12.3.7 節,〈國家字元集〉第 12.3.8 節,〈字元集引導器〉

在字串中,除非啟用 NO_BACKSLASH_ESCAPES SQL 模式,否則某些序列具有特殊含義。每個序列都以反斜線 (\) 開頭,稱為跳脫字元。MySQL 會辨識表 11.1,〈特殊字元跳脫序列〉中顯示的跳脫序列。對於所有其他跳脫序列,會忽略反斜線。也就是說,會將跳脫的字元解譯為未跳脫的字元。例如,\x 就只是 x。這些序列會區分大小寫。例如,\b 會被解譯為退格鍵,但 \B 會被解譯為 B。會根據 character_set_connection 系統變數所指示的字元集完成跳脫處理。即使對於前面帶有引導器 (指示不同字元集) 的字串,情況也是如此,如第 12.3.6 節,〈字元字串字面值字元集和定序〉中所述。

表 11.1 特殊字元跳脫序列

跳脫序列 序列所代表的字元
\0 ASCII NUL (X'00') 字元
\' 單引號 (') 字元
\" 雙引號 (") 字元
\b 退格字元
\n 換行 (換行符號) 字元
\r 歸位字元
\t Tab 字元
\Z ASCII 26 (Control+Z);請參閱表格後面的注意事項
\\ 反斜線 (\) 字元
\% % 字元;請參閱表格後面的注意事項
\_ _ 字元;請參閱表格後面的注意事項

ASCII 26 字元可以編碼為 \Z,讓您能夠解決 ASCII 26 在 Windows 上代表檔案結尾的問題。如果您嘗試使用 mysql db_name < file_name,檔案中的 ASCII 26 會造成問題。

在模式比對環境中,\%\_ 序列是用來搜尋 %_ 的文字執行個體,在這些環境中,它們否則會被解譯為萬用字元。請參閱第 14.8.1 節,〈字串比較函式和運算子〉LIKE 運算子的說明。如果您在模式比對環境之外使用 \%\_,它們會評估為字串 \%\_,而非 %_

有幾種方式可以在字串中包含引號字元:

  • ' 引號的字串內的 ' 可以寫成 ''

  • " 引號的字串內的 " 可以寫成 ""

  • 在引號字元前面加上跳脫字元 (\)。

  • " 引號的字串內的 ' 不需要特殊處理,也不需要加倍或跳脫。同樣地,以 ' 引號的字串內的 " 不需要特殊處理。

下列 SELECT 陳述式示範引號和跳脫的運作方式:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

若要將二進位資料插入字串資料行 (例如 BLOB 資料行),您應該使用跳脫序列來表示某些字元。必須跳脫反斜線 (\) 和用來引號字串的引號字元。在某些用戶端環境中,可能也需要跳脫 NUL 或 Control+Z。mysql 用戶端會截斷包含未跳脫的 NUL 字元的引號字串,如果未跳脫 Control+Z,則在 Windows 上可能會將其視為檔案結尾。如需代表每個字元的跳脫序列,請參閱表 11.1,〈特殊字元跳脫序列〉

在撰寫應用程式時,任何可能包含這些特殊字元的字串都必須適當跳脫,才能將字串用作傳送至 MySQL 伺服器的 SQL 陳述式中的資料值。您可以用兩種方式執行此操作:

  • 使用跳脫特殊字元的函式來處理字串。在 C 程式中,您可以使用 mysql_real_escape_string_quote() C API 函式來跳脫字元。請參閱mysql_real_escape_string_quote()。在建構其他 SQL 陳述式的 SQL 陳述式中,您可以使用 QUOTE() 函式。Perl DBI 介面提供 quote 方法來將特殊字元轉換為正確的跳脫序列。請參閱第 31.9 節,〈MySQL Perl API〉。其他語言介面可能會提供類似的功能。

  • 作為明確跳脫特殊字元的替代方案,許多 MySQL API 提供了佔位符功能,讓您能夠在語句字串中插入特殊標記,然後在發出語句時將資料值繫結到這些標記。在這種情況下,API 會負責為您跳脫值中的特殊字元。