最近公司一個舊的項目需要支持 emoji 表情,一開始以為只要修改下數據庫的表字段就好,沒想到引發了一系列的問題。這里總結下,以作備忘。
character_set_server: 默認的內部操作字符集
character_set_client: 客戶端來源數據使用的字符集
character_set_connection:連接層字符集
character_set_results: ? 查詢結果字符集
character_set_database: ?當前選中數據庫的默認字符集
character_set_system: ? ?系統元數據(字段名等)字符集
02 MySQL 中的字符集轉換過程
-
MySQL Server收到請求時將請求數據從 character_set_client 轉換為character_set_connection;
-
進行內部操作前將請求數據從 character_set_connection 轉換為內部操作字符集,其確定方法如下:
-
使用表中字段的 CHARACTER SET 設定值;
-
若上述值不存在,則使用對應數據表的 DEFAULT CHARACTER SET 設定值(MySQL擴展,非SQL標準);
-
若上述值不存在,則使用對應數據庫的 DEFAULT CHARACTER SET 設定值;
-
若上述值不存在,則使用 character_set_server 設定值。
-
將操作結果從內部操作字符集轉換為 character_set_results, 響應請求。
03 MySQL 啟動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 表情的,原因參照字符集轉換過程)。
-
MySQL的字符集也需要是utf8mb4
-
character_set_server、character_set_database 等默認字符集的類型并沒有那么重要,但最好還是保持一致
-
TP 的坑果然是多,遠離TP