1. 程式人生 > 其它 >儲存emoji表情或特殊字元報錯(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')

儲存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字元集了。