文章目录
一、背景
使用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