MySQL 有許多運算子和函數會傳回字串。本節回答問題:此類字串的字元集和校對為何?
對於接受字串輸入並傳回字串結果作為輸出的簡單函數,輸出的字元集和校對與主要輸入值相同。例如,UPPER(
會傳回具有與 X
)X
相同字元字串和校對的字串。這同樣適用於 INSTR()
、LCASE()
、LOWER()
、LTRIM()
、MID()
、REPEAT()
、REPLACE()
、REVERSE()
、RIGHT()
、RPAD()
、RTRIM()
、SOUNDEX()
、SUBSTRING()
、TRIM()
、UCASE()
和 UPPER()
。
與所有其他函數不同,REPLACE()
函數總是忽略字串輸入的校對,並執行區分大小寫的比較。
如果字串輸入或函數結果是二進位字串,則該字串具有 binary
字元集和校對。可以使用 CHARSET()
和 COLLATION()
函數來檢查這一點,這兩個函數都會為二進位字串引數傳回 binary
mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary | binary |
+---------------------+-----------------------+
對於結合多個字串輸入並傳回單一字串輸出的運算,標準 SQL 的 「彙總規則」適用於判斷結果的校對
如果發生明確的
COLLATE
,請使用Y
Y
。如果發生明確的
COLLATE
和Y
COLLATE
,則會引發錯誤。Z
否則,如果所有校對都是
Y
,則使用Y
。否則,結果沒有校對。
例如,使用 CASE ... WHEN a THEN b WHEN b THEN c COLLATE
,產生的校對為 X
ENDX
。這同樣適用於 UNION
、||
、CONCAT()
、ELT()
、GREATEST()
、IF()
和 LEAST()
。
對於轉換為字元資料的操作,操作產生的字串的字元集和校對是由 character_set_connection
和 collation_connection
系統變數所定義,這些變數決定了預設的連線字元集和校對(請參閱第 12.4 節,「連線字元集和校對」)。這僅適用於 BIN_TO_UUID()
、CAST()
、CONV()
、FORMAT()
、HEX()
和 SPACE()
。
對於虛擬產生欄位的表達式,上述原則有一個例外。在這些表達式中,無論連線字元集為何,BIN_TO_UUID()
、CONV()
或 HEX()
的結果都會使用表格字元集。
如果對於字串函數傳回結果的字元集或校對有任何疑問,請使用 CHARSET()
或 COLLATION()
函數來找出答案。
mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+--------------------+
| USER() | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+--------------------+
| test@localhost | utf8mb3 | utf8mb3_general_ci |
+----------------+-----------------+--------------------+
mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------------------+----------------------------+
| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------------------+----------------------------+
| binary | binary |
+--------------------------+----------------------------+