儲存emoji表情或特殊字元報錯(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')
今天發生一件有趣的事情。
我在一篇文章中使用了emoji表情
,前面很順利,不管是WordPress還是其他部落格園啥的,都是正常傳送。
但是,我在Typecho系統中釋出文章時....
我當時一臉懵逼,啥情況,資料庫壞了?
我重啟伺服器,發現沒用,於是準備直接使用Navicat
工具直接寫入資料庫。
巧了,還是報錯,不管可算知道問題了。
瀏覽器搜尋一番後,發現,是表情的問題。
如何解決?
於是既然是錯誤,那我就解決一下吧。
首先,我們要知道,utf8是Typecho系統寫入資料庫是的預設編碼,也是安裝MySQL是的預設編碼。
Typecho 預設是不支援 Emoji 表情的,當你評論中有 Emoji 的話,就會報這個錯誤。這個是因為編碼的問題造成的。Mysql 預設使用的是 utf8 字符集,utf8 字符集的編碼範圍 u0000-uFFFF,而 Emoji 是在 Unicode 位於 u1F601-u1F64F 區段的字元。所以評論中帶有 Emoji 表情才會報錯。
-
修改Typecho配置檔案
Typecho修改網站的配置檔案,開啟網站根目錄,找到
config.inc.php
檔案,把charset
的值改為urf8mb4
。如果是Java,可以修改資料庫連線字串的編碼。其他語言也類似。
-
修改MySQL全域性預設編碼
首先,找到
my.cnf
檔案,Window是my.ini
檔案。寶塔面板直接找。
[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 init_connect='SET NAMES utf8mb4'
找到之後直接將上面這串程式碼貼上到檔案的空位置,一般就最下面就可以。
這樣之後,重啟MySQL服務。
重啟之後效果我們可以使用SQL語句看看。
上面部分是沒改之前的,下面是改完後。
這樣就可以了。
- Typecho玩家請注意!
alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_options convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_users convert to character set utf8mb4 collate utf8mb4_general_ci;
請執行這一段SQL語句,至於怎麼執行這就不說了,太基礎。
這樣,就可以正常釋出帶有表情的文章了。
延伸知識
1、MySQL在5.5.3之後增加了這個utf8mb4的編碼,所以最低mysql版本支援版本為5.5.3+,若不是,請升級到較新版本;
2、mb4就是most bytes 4的意思,可以用來相容四位元組的unicode,儲存與獲取資料的時候,不用再考慮表情字元的編碼與解碼問題。如果你要存網際網路emoji表情,就需要utf8mb4,而不是utf-8;
3、utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換;
4、MySQL資料庫的 “utf8”並不是真正概念裡的 UTF-8,MySQL中的“utf8”編碼只支援最大3位元組每字元。真正的大家正在使用的UTF-8編碼是應該能支援4位元組每個字元,MySQL的開發者沒有修復這個bug。他們在2010年增加了一個變通的方法:一個新的字符集“utf8mb4”,他們並沒有對外公佈(可能因為這個bug有點尷尬)。現在很多指南推薦使用者使用“utf8”其實都錯了;
5、建議MySQL和MariaDB使用者使用“utf8mb4”而不是“utf8”,畢竟現在是不管使用 Anroidz裝置,還是 iOS 裝置,如果插入包含有 emoji 表情符號的記錄時就報錯,還是很尷尬的;
6、最重要一點,對資料庫操作前,記得備份資料。
為什麼要修改編碼才行?
為什麼要把資料庫的字符集設定成utf8mb4呢?以前一直用的都是utf8啊?
utf8適用於不使用移動裝置的網際網路互動,utf8mb4適用於當前的移動裝置網際網路開發,因為移動裝置中常常會有表情符號(emoji)的儲存,它佔用4個位元組的儲存空間,而utf8是3個位元組,這樣,用3個位元組去儲存4個位元組的東西,很明顯是存不下的,會報錯,所以要用utf8mb4,並且utf8mb4是相容utf8的,那麼,就沒有理由不用utf8mb4字元集了。