關于MySQL字符集問題詳解(圖)

最近公司一個舊的項目需要支持 emoji 表情,一開始以為只要修改下數據庫的表字段就好,沒想到引發了一系列的問題。這里總結下,以作備忘。

01 MySQL MySQL設置

關于MySQL字符集問題詳解(圖)

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

關于MySQL字符集問題詳解(圖)

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

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享