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