MySQL/Character Sets and Collations

維基教科書,自由的教學讀本

應用程式與資料庫交互時,為避免出現亂碼,需要注意字符集與字符比較的設置。

MySQL字符集[編輯]

查看資料庫使用的各種字符集與字符比較:

mysql> SHOW SESSION VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | gbk     |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | gbk     |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+
7 rows in set (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'collation_connection';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
1 row in set (0.00 sec)

從mysql 8.0開始,mysql默認的CHARSET已經不再是Latin1了,改為了utf8mb4(參考連結),並且默認的COLLATE也改為了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大體上就是unicode的進一步細分,0900指代unicode比較算法的編號( Unicode Collation Algorithm version),ai表示accent insensitive(發音無關),例如e, è, é, ê 和 ë是一視同仁的。ci表示大小寫無關。可以在session、database、table、column、query各級別設定collation規則。

高版本(8.0以上)的資料庫內部採用了utf8mb4字符集編碼。因此,對外界有影響的是3個字符集設置:

  • character_set_client: 客戶端發給資料庫的語句(statement)所用的字符編碼
  • character_set_connection :資料庫收到客戶端發來的語句後的轉碼字符集及字符比較,例如:select '中國' > '世界';
  • character_set_results :資料庫把結果發給客戶端所用的字符集。

可見,如果上述字符集都設置為utf8mb4,就可以避免亂碼。

character_set_client設置[編輯]

mysql客戶端預設採用作業系統的當前代碼頁為character_set_client;

mysql客戶端的配置文件設置:

[mysql]
default-character-set=koi8r

連接時指定:

 mysql --default-character-set=

在connection string中設置:

connectionString="server=127.0.0.1;User Id=root;password=123;Persist Security Info=True;database=myDBName;charset=utf8mb4"

客戶端/應用程式的編碼設置[編輯]

對於網頁,可設置:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

對於ASP.NET項目,在web.config配置:

<globalization fileEncoding="utf-8" />

一個完整的URL可以簡單地認為包含二個部分:文件路徑(含目錄) 和 查詢參數(QueryString)。在編碼時,一定要分開處理:

  • 編碼文件路徑時,應該選擇 encodeURI,HttpUtility.UrlPathEncode 。
  • 編碼查詢參數時,應該選擇 encodeURIComponent,HttpUtility.UrlEncode,而且拼接方式應該是:Encode(key) + "=" + Encode(value)

mysql不支持的字符編碼[編輯]

  • ucs2
  • utf16
  • utf16le
  • utf32