MySQL/Character Sets and Collations
外觀
< MySQL
應用程式與資料庫交互時,為避免出現亂碼,需要注意字符集與字符比較的設置。
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