最近公司一箇舊的項目須要支持 emoji 表情,一開始覺得只要修改下數據庫的表字段就好,沒想到引起了一系列的問題。這裏總結下,以做備忘。html
01 MySQL 字符集設置mysql
系統變量:sql
character_set_server: 默認的內部操做字符集
character_set_client: 客戶端來源數據使用的字符集
character_set_connection:鏈接層字符集
character_set_results: 查詢結果字符集
character_set_database: 當前選中數據庫的默認字符集
character_set_system: 系統元數據(字段名等)字符集數據庫
02 MySQL 中的字符集轉換過程spa
MySQL Server收到請求時將請求數據從 character_set_client
轉換爲character_set_connection
;命令行
進行內部操做前將請求數據從 character_set_connection
轉換爲內部操做字符集,其肯定方法以下:code
使用表中字段的 CHARACTER SET 設定值;server
若上述值不存在,則使用對應數據表的 DEFAULT CHARACTER SET 設定值(MySQL擴展,非SQL標準);htm
若上述值不存在,則使用對應數據庫的 DEFAULT CHARACTER SET 設定值;排序
若上述值不存在,則使用 character_set_server
設定值。
將操做結果從內部操做字符集轉換爲 character_set_results
, 響應請求。
03 MySQL 啓動配置文件 my.cnf
default-character-set: 設置 mysql 命令行鏈接的默認字符集
character-set-server: 設置系統內部操做字符集(即上文說到的character_set_server)
collation_server: 設置系統默認字符集排序
04 PHP鏈接 MySQL(以PDO鏈接方式爲例)
常見的兩種設置字符集的方式
mysql:host=localhost;dbname=db_demo;charset=utf8mb4
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
05 總結
數據表字段的字符集須要是utf8mb4
,這個是剛需
通常 character_set_client
、character_set_connection
、character_set_results
的字符集相同,且都爲utf8mb4
(這三個參數默認都是utf8mb4
,若是不是,是實現不了 emoji 表情的,緣由參照字符集轉換過程)。
鏈接數據庫的字符集也須要是utf8mb4
character_set_server
、character_set_database
等默認字符集的類型並無那麼重要,但最好仍是保持一致
TP 的坑果真是多,遠離TP
參考