今天有業務員反應,編輯某個用戶的信息的時候出現了異常,異常信息如下: Incorrect string value: "xFOx9Fx92x9D vxE6..'f or 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之後,通知業務員重新操作。業務員反應操作成功了。。。心裡美滋滋