在開發(fā)小程序時flask作為服務(wù)端,用mysql作為數(shù)據(jù)庫。
小程序中允許用戶輸入包含emoji的文字內(nèi)容, 測試過程中發(fā)現(xiàn)報出如下錯誤:
(_mysql_exceptions.OperationalError) (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\xB2' for column 'content' at row 1")
大致意思是說,傳入的字符不正確。
首先想到的是字符集的問題,于是百度了一下“mysql支持emoji”,果然找到了答案。創(chuàng)建數(shù)據(jù)庫的時候,我習(xí)慣性地使用了utf8,然后要支持emoji的話,需要使用utf8mb4。
可以參考這篇文章進行修改 MySQL中支持emoji表情的存儲
注意,按需修改,如果你只是個別字段需要emoji的話, 就只改某個字段,減少影響范圍。
另外,這個修改是不需要重啟mysql服務(wù)的
修改完成后,試了一下,emoji變成了青一色的四個問號,????。
既然字符集沒有問題了,那么應(yīng)該是傳輸過程中的內(nèi)容轉(zhuǎn)換。由于使用的是flask_sqlalchemy來連接數(shù)據(jù)庫的,查看了文檔后,發(fā)現(xiàn),數(shù)據(jù)庫連接默認(rèn)使用utf-8方式連接。
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://db_user:db_user_pwd@address:port/db_name'
可以使用下面的方式來修改連接時的默認(rèn)字符集
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://db_user:db_user_pwd@address:port/db_name?charset=utf8mb4'
測試可用。
環(huán)境
centos 7
python 3.6
flask 1.0.2
mysql 5.6