文章目錄
一、背景
使用django+python+mysql開發微信公衆號的後臺服務器,在將用戶的暱稱存入數據庫時,報錯.
- 因爲
emoji
表情的存在所導致!只有utf8mb4_unicode_ci
的字符集才支持! - 重點:
mysql
的utf8
並不是真正的’utf-8’,mysql在後續用的utf8mb4
纔是真正的’utf-8’
二、字符集介紹分析
字符集的簡單對比:
-
utf8_general_ci
不區分大小寫,這個你在註冊用戶名和郵箱的時候就要使用。 -
utf8_general_cs
區分大小寫,如果用戶名和郵箱用這個就會照成不良後果。 -
utf8_bin
: compare strings by the binary value of each character in the string 將字符串每個字符串用二進制數據編譯存儲,區分大小寫,而且可以存二進制的內容。 -
utf8_unicode_ci
校對規則僅部分支持Unicode校對規則算法,一些字符還是不能支持
utf8_unicode_ci
比較準確,utf8_general_ci
速度比較快。通常情況下utf8_general_ci
的準確性就夠我們用的了,在我看過很多程序源碼後,發現它們大多數也用的是utf8_general_ci
,所以新建數據 庫時一般選用utf8_general_ci
就可以了
三、解決辦法(設置字符集爲utf8mb4):
之前將數據庫的編碼設置成utf8,當存入字母或中文字符時,都是3個字節.
而當用戶的暱稱存在emoji表情時,該表情對應的編碼是4個字節,也就是utf8mb4格式.
1. 進入mysql,執行命令,直接在數據庫層操作
-- 1.查看到數據庫的字符集設置
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
-- 查看錶格所有字段字符集的格式
SHOW FULL COLUMNS FROM account_wechat_account
-- 修改表的字符集格式
ALTER TABLE account_wechat_account DEFAULT CHARACTER SET utf8 COLLATE utf8mb4_unicode_ci
-- 2,修改數據庫,表,列的字符集.
-- 修改Database字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改Table字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改column字符集
ALTER TABLE table_name CHANGE column_name column_name longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
ALTER TABLE `payment_share_code_record`
CHANGE `nickname` `nickname` varchar(40) COLLATE 'utf8mb4_unicode_ci' NULL AFTER `actual_name`;
上面的命令我沒有打錯,CHANGE後面跟兩遍表名。
請不要單純的複製粘貼,你可能需要修改數據庫名,表名,列名和not null.
2. 修改django
連接數據庫時的字符集(setting.py文件)
在django項目的setting文件中,你必須設置charset=utf8mb4
,
數據庫的配置模板如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'example',
'USER': 'example',
'PASSWORD': 'example',
'HOST': '',
'PORT': '',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
3.flask/sqlalchemy
設置字符集的格式:
connect_engine = create_engine('mysql://user:[email protected]/db?charset=utf8mb4') # utf8mb4支持更全的字符格式
4.最後一步,不是必須的.但是強烈建議進行設置(mysql配置文件).
在/etc/mysql/my.cnf
文件中,設置以下幾項:
[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