字串是以單引號 ('
) 或雙引號 ("
) 字元括起來的位元組或字元序列。範例:
'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 節:「字元字串字面值的字元集和定序」中所述。
可以將 ASCII 26 字元編碼為 \Z
,讓您可以解決 Windows 上 ASCII 26 代表檔案結尾的問題。如果您嘗試使用 mysql
,則檔案內的 ASCII 26 會導致問題。db_name
< file_name
\%
和 \_
序列會用來在模式比對內容中搜尋 %
和 _
的常值執行個體,在這些內容中,它們會被解譯為萬用字元。請參閱第 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 會負責為您跳脫這些值中的特殊字元。