字串是以單引號 ('
) 或雙引號 ("
) 字元括住的位元組或字元序列。範例:
'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 節,〈字元字串字面值字元集和定序〉中所述。
ASCII 26 字元可以編碼為 \Z
,讓您能夠解決 ASCII 26 在 Windows 上代表檔案結尾的問題。如果您嘗試使用 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 會負責為您跳脫值中的特殊字元。