1. 程式人生 > 資料庫 >MySQL儲存微信暱稱中的特殊符號造成:(Incorrect string value: "xxxx'for column ‘name’ at row 1)異常

MySQL儲存微信暱稱中的特殊符號造成:(Incorrect string value: "xxxx'for column ‘name’ at row 1)異常

今天有業務員反應,編輯某個使用者的資訊的時候出現了異常,異常資訊如下:
Incorrect string value: "xFOx9Fx92x9D vxE6..'f or column 'name' at row 1
我讓她發個截圖看看,結果發現該使用者的暱稱如下:

原圖

該暱稱是微信暱稱,也未免會帶一些特殊符號或者,既然異常由資料庫丟擲,我們不妨檢視一下該欄位的字符集:

原來如此

最初的 UTF-8 格式使用一至六個位元組,最大能編碼 31 位字元。最新的 UTF-8 規範只使用一到四個位元組,最大能編碼21位,正好能夠表示所有的 17個 Unicode 平面。

utf8 是 Mysql 中的一種字符集,只支援最長三個位元組的 UTF-8字元,也就是 Unicode 中的基本多文字平面。

Mysql 中的 utf8 為什麼只支援持最長三個位元組的 UTF-8字元呢?我想了一下,可能是因為 Mysql 剛開始開發那會,Unicode 還沒有輔助平面這一說呢。那時候,Unicode 委員會還做著 “65535 個字元足夠全世界用了”的美夢。Mysql 中的字串長度算的是字元數而非位元組數,對於 CHAR 資料型別來說,需要為字串保留足夠的長。當使用 utf8 字符集時,需要保留的長度就是 utf8 最長字元長度乘以字串長度,所以這裡理所當然的限制了 utf8 最大長度為 3,比如 CHAR(100) Mysql 會保留 300位元組長度。至於後續的版本為什麼不對 4 位元組長度的 UTF-8 字元提供支援,我想一個是為了向後相容性的考慮,還有就是基本多文種平面之外的字元確實很少用到。

要在 Mysql 中儲存 4 位元組長度的 UTF-8 字元,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後的才支援(檢視版本: select version();)。我覺得,為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8. 對於 CHAR 型別資料,utf8mb4 會多消耗一些空間,根據 Mysql 官方建議,使用 VARCHAR 替代 CHAR。

我們嘗試作出修改:

將utf8字符集修改為utf8mb4之後,通知業務員重新操作。業務員反應操作成功了。。。心裡美滋滋