特殊字符編碼格式數據庫不支持

字符編碼格式數據庫不支持

  • 原數據庫字符集設置爲CHARSET=utf8,有些數據編碼格式例如emoji的表情符號mysql 中的utf8並不支持
  • 據官方文檔的解釋:

    mysql 支持的 utf8 編碼最大字符長度爲 3 字節,如果遇到 4 字節的寬字符就會插入異常了。三個字節的 UTF-8 最大能編碼的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文種平面(BMP)。

  • 也就是說,任何不在基本多文本平面的 Unicode字符,都無法使用 Mysql 的 utf8 字符集存儲。包括 Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字符等等。

  • 觀察日誌數據發現linux下打印出的日誌存在類似 <u+1f44d> 樣式的字符,屬於unicode編碼的特殊字符,文本內容也是在此截斷的,由此可以判斷爲字符編碼格式問題

3. 解決方案

3.1 升級 mysql 版本,並將utf8字符集升級到utf8mb4

升級你的 mysql 到 5.5.3 之後即可,查看當前環境版本:

select version();
  • MySQL在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。好在utf8mb4是utf8的超集,除了將編碼改爲utf8bp4外不需要做其他轉換。當然,爲了節省空間,一般情況下使用utf8也就夠了。
  • 所以好的技術就是,採用對當前而言最好的解決方案,然後再逐步迭代滿足新的需求。

3.1.1 直接修改表結構

--修改數據庫字符集
ALTER DATABASE test CHARACTER SET = utf8mb4;
--修改表字符集
alter table test convert to character set utf8mb4;
--修改字符字符集
ALTER TABLE `test` CHANGE COLUMN `name` `name` varchar(12) CHARACTER SET utf8mb4;

3.1.2 修改數據庫默認配置

[client]
default-character-set = utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4

3.2 修改數據庫字段類型

修改字段類型爲二進制存儲,通過樣可以達到目的,進行兼容

--修改字符字符集
ALTER TABLE `test` CHANGE COLUMN `name` `name` MediumBlob ;

3.3 強行過濾掉生僻字符串

  • 從業務和技術的角度綜合考慮,可以做個折中,將生僻字符串提前過濾掉,因爲這類字符串本來就使用的很少,即使存進數據庫了,展示、查詢的時候也會多少有其它的問題,不如直接過濾掉,mysql 不支持四字節的 utf8 一方面可能是歷史包袱,另一方面估計也是爲了省空間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章