如何在 MySQL 儲存 emoji

老實說之前還真的不知道, 天真的以為 utf8 就可以存了, 一直到有人問說能不能支援 iPhone 的 emoji, 才發現真的不行啊 XD

查了一下, 原來是得用 utf8mb4

所以得做兩件事:

  1. 修改資料庫欄位語系
  2. 修改程式連線設定

修改欄位語系

得把相關欄位的都改成 utf8mb4, 像是 encoding 設成 utf8mb4, 而 collation 設成 utf8mb4_bin

不然可能會有下面這樣的錯誤訊息, 或者是就被程式略過了。

Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'column_name' at row 1  

可惜沒找到可以快速轉換整個資料庫的 script, 目前偷懶, 先手動把幾個會用到 emoji 的欄位直接從 utf8 改成 utf8mb4 (笑)

修改程式連線設定

使用 Django 的話, 由於預設的 charset 是 utf8, settings 裡的 DATABASES 的設定也得設定一下 OPTIONS, 才能夠正常使用。

'OPTIONS': {'charset':'utf8mb4'}  

基本上這樣就可以正常儲存跟顯示 emoji 了。

其他

比較全面一點的話, 還得改 mysql 的一些設定, 像是 default charset, 像是

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE  
character-set-server = utf8mb4  
collation-server = utf8mb4_unicode_ci  

另外值得注意的一點是, InnoDB varchar 的 index 原本在 utf8 最大可以到 255, 可是轉換到 utf8mb4 後則是 191 了, 所以如果索引到 varchar(255) 這類欄位的人, 轉換後也得調整一下, 改成 varchar(191)

參考文章:

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!