背景
? ?
最近開發(fā)了一個(gè)分享言論的小程序后端, 開發(fā)過程中遇到了微信用戶的昵稱是??(emoji)的, 結(jié)果發(fā)現(xiàn)數(shù)據(jù)庫儲(chǔ)存的是亂碼顯示了一大堆??號(hào)
這讓我很是頭疼, 到網(wǎng)上找到了一個(gè)外國同行寫的blog,算是解決了mysql儲(chǔ)存emoji表情的問題
首先這個(gè)問題是由于編碼位數(shù)不同引起的, 在mysql中默認(rèn)的utf8是3位的, emoji表情是四位, 所以用三位空間儲(chǔ)存四位的儲(chǔ)存空間肯定出問題,
所示emoji儲(chǔ)存需要占位更高的utf8mb4進(jìn)行儲(chǔ)存
在默認(rèn)使用utf8編碼創(chuàng)建的數(shù)據(jù)庫,我們修改時(shí)需要按照有大到小的順序依次修改, 也就是說:
數(shù)據(jù)庫 ->? 表 - > 字段
數(shù)據(jù)庫修改
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
表修改
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
字段修改
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 注意這里的database_name,table_name,column_name,191都是根據(jù)自身情況進(jìn)行修改的
?
這個(gè)時(shí)候我們就已經(jīng)修改完了想要儲(chǔ)存emoji表情的字段
可是在實(shí)際的操作下, 我發(fā)現(xiàn)儲(chǔ)存的emoji表情仍然為問號(hào),經(jīng)過反復(fù)的對(duì)比發(fā)現(xiàn)數(shù)據(jù)庫的修改已經(jīng)完成了。
于是想到了是不是django這邊的出了問題,后來查到了需要在django settings 中數(shù)據(jù)庫database中加入一個(gè)指定字符編碼的項(xiàng),
DATABASES = {
????'default': {
????'ENGINE':'django.db.backends.mysql',
????'HOST':'127.0.0.1',
????'USER':'root',
????'PASSWORD':'123456',
????'NAME':'dacoff',
????'OPTIONS': {'charset':'utf8mb4'},
????}
}
這樣就可以在mysql中保存emoji表情了
查考文章:https://mathiasbynens.be/notes/mysql-utf8mb4#column-index-length