MySQL字符集,永恒的痛
本文轉載自微信公眾號「虞大膽的嘰嘰喳喳」,作者虞大膽。轉載本文請聯(lián)系虞大膽的嘰嘰喳喳公眾號。
最近遷移mysql和升級mysql版本,遇到了很多亂碼(主要是表情問題)問題,所以記錄下。
mysql字符集分別支持四種級別的字符集和對應的比較規(guī)則,比如服務器級別的是character_set_server,數(shù)據(jù)庫級別的是character_set_database,表級別和列級別也可以設置字符集,比如:
- create database test CHARSET set utf8mb4 COLLATE utf8_general_ci
另外字符集比較也要遵循規(guī)則,比較常用的比較規(guī)則是utf8_general_ci。
一般服務器啟動的時候配置:
- [mysqld]
- character_set_server = utf8mb4
在安裝和創(chuàng)建庫表的時候,盡量使用utf8mb4字符集。
對于客戶端(比如程序驅(qū)動、mysql工具集)有三個和字符集有關的系統(tǒng)變量,分別是character_set_client,character_set_connection,character_set_results,用于客戶端編碼解碼,并和數(shù)據(jù)庫交互。
這三個參數(shù)其實通過default-character-set或set names一次性指定。
具體遇到的問題分別是:
1:mysql導入導出的指定default-character-set為utf8mb4,或者會出現(xiàn)亂碼。
2:服務器級別的字符集配置為utf8mb4,庫、表、列即使不指定,也會繼承服務器級別的配置。
3;mysql工具集,盡量顯示指定—default-character-set字符集,比如:
- [client]
- default-character-set=utf8mb4
- [mysql]
- default-character-set=utf8mb4
4:如果有proxy,一定要在proxy上指定字符集
5:如果不知道有沒有問題,通過phpmyadmin查看和修改,尤其查看其具體執(zhí)行的mysql語句。
6:編譯的時候指定字符集,比如:
- cmake -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8mb4_general_ci
參考:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html