MySQL 字符集問題

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

最近公司一箇舊的專案需要支援 emoji 表情,一開始以為只要修改下資料庫的表欄位就好,沒想到引發了一系列的問題。這裡總結下,以作備忘。

01 MySQL 字符集設定

  • 系統變數:

clipboard.png

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 啟動配置檔案 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

參考

相關文章

資料庫 最新文章