Bug背景
之前在寫Flask入門項目Flask Mega項目的時候,一直都是用SQLite,後面切換到Mysql數據庫發現在存入一些EMOJI表情符號的時候,會出現如下的報錯。
Bug解決思路
剛開始覺得應該是數據庫的編碼的問題,因爲之前也遇到數據庫存入特殊符號的時候發生報錯。那先查看服務器上面的數據庫編碼格式。
show variables like '%char%';
通過查看數據庫編碼發現都是utf8格式。然後查閱有關的資料,以及翻閱之前做過的筆記發現,Mysql中的utf8編碼格式最多支持最多3字節的數據,而emoji表情字符是4個字節的字符,如果採用utf8的數據庫插入表情字符,就會因爲被截斷導致無法存入到數據庫。
Bug解決過程
大概理解了原理就好辦了,修改數據庫的編碼格式,因爲我是使用的是Mariadb數據庫
我修改的是/etc/my.cnf,/etc/my.cnf.d/目錄下的配置文件,大概修改有這幾項內容:
[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’
然後重啓mariadb數據庫,進入數據庫中查看是否修改成功:
修改成功,然後接着修改數據庫和表的編碼格式:
alter database database_name character set 'utf8mb4' collate 'utf8mb4_general_ci';
表格編碼格式:
alter table table_name convert to character set 'utf8mb4' collate 'utf8mb4_general_ci';
查看是否修改成功:
修改成功!!!
重啓項目然後再次寫入帶有Emoji表情符號的評論到數據庫中,發現還是出現了問題,重新梳理了一下思路大概是因爲Flask項目中的SQLAlchemy連接Mysql的編碼格式錯誤,重新修改了一下連接數據庫的編碼格式:
再次重啓項目重新發布評論:
大功告成,問題解決。
參考鏈接
https://blog.csdn.net/woslx/article/details/49685111
https://blog.csdn.net/poice00/article/details/52129351