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

11.1.1 字串字面值

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

'a string'
"another string"

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

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

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

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

對於兩種字串類型,比較都基於字串單元的數值。對於二進位字串,單元是位元組;比較使用數值位元組值。對於非二進位字串,單元是字元,而某些字元集支援多位元組字元;比較使用數值字元碼值。字元碼順序是字串定序的函式。(如需更多資訊,請參閱第 12.8.5 節:「二進位定序與 _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,讓您可以解決 Windows 上 ASCII 26 代表檔案結尾的問題。如果您嘗試使用 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 會負責為您跳脫這些值中的特殊字元。