本博客的記錄的操作在linux
項目中需要從微信獲取授權來登錄,在此過程,保存微信emoji表情昵稱到mysql數據庫的時候出了錯誤。
老規矩百度一下,得知是mysql的utf8字符集只支持1-3個字節的字符,而表情則需要4個字節,所以mysql提供了一個utf8mb4字符集,在支持4個字節的同時又可以完美兼容utf8,免去我們的后顧之憂。
百度大部分的步驟是這樣的,1-3步驟可以使用命令也可以使用工具(例如Navicat)來完成。
1:修改數據庫字符集:
(1) 命令方式:ALTER DATABASE 數據庫名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
(2)工具方式:選中指定數據庫,郵件選擇數據庫屬性,修改字符集與排序規則如下:
2:修改數據庫表的字符集
(1)命令方式: 首先切換到步驟1所操作的數據庫,隨后執行命令:ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(2)工具方式: 打開數據庫,選擇要操作的表,右鍵選擇設計表,選擇選項,選擇字符集和排序規則如下:
3:修改列的字符集
(1)命令方式: ALTER TABLE 表名 CHANGE 字段名 該字段原來的數據類型 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
例:ALTER TABLE user CHANGE name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(2)工具方式: 選中要操作的表,右鍵選擇設計表,選擇指定字段,修改字符集和排序規則如下:
4:修改my.cnf文件(windows是my.ini文件)
編輯文件,添加以下內容:
[client] 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] default-character-set=utf8mb4
5:最后還需要重啟一下mysql哦。
上述方式適用於普通的mysql使用表情的問題。如果使用mybatis做持久層操作,可能會碰到更坑的問題,這些你都配置了,依然不會成功。找了很多資料,終於發現一位博主的解答,連接池的配置中可以添加這么一個配置:
<property name="connectionInitSqls"> <list> <value>set names utf8mb4</value> </list> </property>
最后,當然是完美的解決了。
很想貼上最后這位博主的鏈接~但找遍了歷史記錄也沒能找到,恨忘記收藏~~~
如果無法通過以上方式解決問題,可以參考下這問簡書博友的文章:https://www.jianshu.com/p/b0f5eb5d7cc3
他使用一種折中的方式,對存儲的內容編碼后保存,取出后再解碼,相對較為麻煩,但也不失為一種解決方式