MySQL 字符集問題

最近公司一箇舊的項目須要支持 emoji 表情,一開始覺得只要修改下數據庫的表字段就好,沒想到引起了一系列的問題。這裏總結下,以做備忘。html

01 MySQL 字符集設置mysql

  • 系統變量:sql

clipboard.png

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

clipboard.png

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_clientcharacter_set_connectioncharacter_set_results 的字符集相同,且都爲utf8mb4(這三個參數默認都是utf8mb4,若是不是,是實現不了 emoji 表情的,緣由參照字符集轉換過程)。

  • 鏈接數據庫的字符集也須要是utf8mb4

  • character_set_servercharacter_set_database 等默認字符集的類型並無那麼重要,但最好仍是保持一致

  • TP 的坑果真是多,遠離TP

參考

相關文章
相關標籤/搜索