文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  字元集、校對、Unicode  /  連線字元集與校對

12.4 連線字元集與校對

連線是指用戶端程式連線至伺服器,以開始與伺服器互動的工作階段。用戶端會透過工作階段連線傳送 SQL 陳述式,例如查詢。伺服器會透過連線將回應 (例如結果集或錯誤訊息) 傳送回用戶端。

連線字元集與校對系統變數

數個字元集和校對系統變數與用戶端與伺服器的互動相關。其中一些已在先前的章節中提及

其他字元集和校對系統變數參與處理用戶端和伺服器之間連線的流量。每個用戶端都有特定於工作階段的連線相關字元集和校對系統變數。這些工作階段系統變數值會在連線時初始化,但可以在工作階段中變更。

關於用戶端連線的字元集和校對處理的數個問題可以用系統變數來回答

若要查看適用於目前工作階段的字元集和校對系統變數的值,請使用此陳述式

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;

下列更簡單的陳述式也會顯示連線變數,但也會包含其他相關變數。它們可以用於查看所有字元集和校對系統變數

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';

用戶端可以微調這些變數的設定,或依賴預設值 (在這種情況下,您可以跳過本節的其餘部分)。如果您不使用預設值,則每次連線至伺服器時都必須變更字元設定。

不允許的用戶端字元集

character_set_client 系統變數無法設定為某些字元集

ucs2
utf16
utf16le
utf32

嘗試使用任何這些字元集作為用戶端字元集會產生錯誤

mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'

如果以下任何情況使用這些字元集,也會發生相同的錯誤,這些情況都會嘗試將 character_set_client 設定為指定的字元集。

用戶端程式連線字元集設定

當用戶端連線到伺服器時,會指出它想要使用哪個字元集來與伺服器進行通訊。(實際上,用戶端會指出該字元集的預設校對規則,伺服器可以從中判斷字元集。)伺服器會使用此資訊將 character_set_clientcharacter_set_resultscharacter_set_connection 系統變數設定為該字元集,並將 collation_connection 設定為該字元集的預設校對規則。實際上,伺服器會執行相當於 SET NAMES 作業的動作。

如果伺服器不支援要求的字元集或校對規則,則會改用伺服器字元集和校對規則來設定連線。如需此回退行為的詳細資訊,請參閱連線字元集錯誤處理

mysqlmysqladminmysqlcheckmysqlimportmysqlshow 用戶端程式會以下列方式判斷要使用的預設字元集:

  • 在沒有其他資訊的情況下,每個用戶端都會使用編譯時內建的預設字元集,通常是 utf8mb4

  • 每個用戶端都可以根據作業系統設定(例如 Unix 系統上的 LANGLC_ALL 地區設定環境變數值,或 Windows 系統上的代碼頁設定)自動偵測要使用的字元集。對於可從作業系統取得地區設定的系統,用戶端會使用它來設定預設字元集,而不是使用編譯時內建的預設值。例如,將 LANG 設定為 ru_RU.KOI8-R 會導致使用 koi8r 字元集。因此,使用者可以設定其環境中的地區設定,供 MySQL 用戶端使用。

    如果沒有完全符合的字元集,作業系統字元集會對應到最接近的 MySQL 字元集。如果用戶端不支援相符的字元集,則會使用編譯時內建的預設值。例如,utf8utf-8 會對應到 utf8mb4,而 ucs2 不支援作為連線字元集,因此它會對應到編譯時內建的預設值。

    C 應用程式可以在連線到伺服器之前,透過如下調用 mysql_options(),使用基於作業系統設定的字元集自動偵測:

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
  • 每個用戶端都支援 --default-character-set 選項,使用者可以明確指定字元集來覆蓋用戶端以其他方式判斷的任何預設值。

    注意

    某些字元集不能用作用戶端字元集。嘗試搭配 --default-character-set 使用它們會產生錯誤。請參閱不可接受的用戶端字元集

對於 mysql 用戶端,若要使用與預設值不同的字元集,您可以在每次連線到伺服器時明確執行 SET NAMES 陳述式(請參閱用戶端程式連線字元集設定)。為了更容易達到相同的效果,請在您的選項檔案中指定字元集。例如,以下選項檔案設定會讓您每次調用 mysql 時,將三個與連線相關的字元集系統變數設定為 koi8r

[mysql]
default-character-set=koi8r

如果您使用啟用自動重新連線(不建議使用)的 mysql 用戶端,最好使用 charset 命令,而不是 SET NAMES。例如:

mysql> charset koi8r
Charset changed

charset 命令會發出 SET NAMES 陳述式,也會變更 mysql 在連線中斷後重新連線時使用的預設字元集。

設定用戶端程式時,您還必須考慮它們執行的環境。請參閱第 12.5 節:「設定應用程式字元集和校對規則」

用於連線字元集設定的 SQL 陳述式

建立連線後,用戶端可以變更目前工作階段的字元集和校對規則系統變數。這些變數可以使用 SET 陳述式單獨變更,但有兩個更方便的陳述式會影響一組與連線相關的字元集系統變數:

  • SET NAMES 'charset_name' [COLLATE 'collation_name']

    SET NAMES 指示用戶端用來將 SQL 陳述式傳送到伺服器的字元集。因此,SET NAMES 'cp1251' 會告訴伺服器:「這個用戶端未來傳入的訊息使用 cp1251 字元集。」它也指定伺服器應該用來將結果傳回用戶端的字元集。(例如,如果使用產生結果集的 SELECT 陳述式,它會指出要用於欄值的字元集。)

    SET NAMES 'charset_name' 陳述式相當於以下三個陳述式:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;

    character_set_connection 設定為 charset_name 也會隱含地將 collation_connection 設定為 charset_name 的預設校對規則。不需要明確設定該校對規則。若要指定用於 collation_connection 的特定校對規則,請新增 COLLATE 子句:

    SET NAMES 'charset_name' COLLATE 'collation_name'
  • SET CHARACTER SET 'charset_name'

    SET CHARACTER SETSET NAMES 相似,但會將 character_set_connectioncollation_connection 設定為 character_set_databasecollation_database(如先前所述,這表示預設資料庫的字元集和校對規則)。

    SET CHARACTER SET charset_name 陳述式相當於以下三個陳述式:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET collation_connection = @@collation_database;

    設定 collation_connection 也會隱含地將 character_set_connection 設定為與校對規則相關聯的字元集(相當於執行 SET character_set_connection = @@character_set_database)。不需要明確設定 character_set_connection

注意

某些字元集不能用作用戶端字元集。嘗試將它們與 SET NAMESSET CHARACTER SET 搭配使用會產生錯誤。請參閱不可接受的用戶端字元集

範例:假設 column1 定義為 CHAR(5) CHARACTER SET latin2。如果您未指定 SET NAMESSET CHARACTER SET,則對於 SELECT column1 FROM t,伺服器會使用用戶端連線時指定的字元集,傳回 column1 的所有值。另一方面,如果您在發出 SELECT 陳述式之前指定 SET NAMES 'latin1'SET CHARACTER SET 'latin1',則伺服器會在傳回結果之前將 latin2 值轉換為 latin1。對於兩個字元集中都未包含的字元,轉換可能會造成遺失。

連線字元集錯誤處理

嘗試使用不適當的連線字元集或校對規則可能會產生錯誤,或者導致伺服器對於給定的連線改用其預設字元集和校對規則。本節說明設定連線字元集時可能發生的問題。這些問題可能會在建立連線時或在已建立的連線中變更字元集時發生。

連線時錯誤處理

某些字元集不能用作客戶端字元集;請參閱不允許的客戶端字元集。如果您指定一個有效但不允許作為客戶端字元集的字元集,伺服器將返回一個錯誤

$> mysql --default-character-set=ucs2
ERROR 1231 (42000): Variable 'character_set_client' can't be set to
the value of 'ucs2'

如果您指定一個客戶端無法識別的字元集,它將產生一個錯誤

$> mysql --default-character-set=bogus
mysql: Character set 'bogus' is not a compiled character set and is
not specified in the '/usr/local/mysql/share/charsets/Index.xml' file
ERROR 2019 (HY000): Can't initialize character set bogus
(path: /usr/local/mysql/share/charsets/)

如果您指定一個客戶端可以識別但伺服器無法識別的字元集,伺服器會退回使用其預設的字元集和校對。假設伺服器配置為使用 latin1latin1_swedish_ci 作為其預設值,並且它不將 gb18030 識別為有效的字元集。一個指定 --default-character-set=gb18030 的客戶端能夠連接到伺服器,但產生的字元集並非客戶端想要的

mysql> SHOW SESSION VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
...
| character_set_results    | latin1 |
...
+--------------------------+--------+
mysql> SHOW SESSION VARIABLES LIKE 'collation_connection';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
+----------------------+-------------------+

您可以看到連線系統變數已被設定為反映 latin1latin1_swedish_ci 的字元集和校對。 發生這種情況是因為伺服器無法滿足客戶端字元集的要求,並退回使用其預設值。

在這種情況下,客戶端無法使用它想要的字元集,因為伺服器不支援它。客戶端必須願意使用不同的字元集,或連接到支援所需字元集的不同伺服器。

當客戶端告訴伺服器使用伺服器可以識別的字元集,但伺服器端不認識客戶端預設的字元集校對時,也會發生同樣的問題。

執行階段錯誤處理

在已建立的連線中,客戶端可以使用 SET NAMESSET CHARACTER SET 來請求更改連線的字元集和校對。

某些字元集不能用作客戶端字元集;請參閱不允許的客戶端字元集。如果您指定一個有效但不允許作為客戶端字元集的字元集,伺服器將返回一個錯誤

mysql> SET NAMES 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client' can't be set to
the value of 'ucs2'

如果伺服器無法識別字元集(或校對),它會產生一個錯誤

mysql> SET NAMES 'bogus';
ERROR 1115 (42000): Unknown character set: 'bogus'

mysql> SET NAMES 'utf8mb4' COLLATE 'bogus';
ERROR 1273 (HY000): Unknown collation: 'bogus'
提示

希望驗證伺服器是否採用其請求的字元集的客戶端,可以在連線後執行以下語句,並檢查結果是否為預期的字元集

SELECT @@character_set_client;