本文主要是介绍阿里云rds+django存储emoji utf8mb4(python2和python3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
python2和python3情况不同,以下分别叙述。在第一章中的所有设置,第二章节不用执行
一、基础环境为python2,mysql5.6, django1.XX
1.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_general_ci
init_connect='SET NAMES utf8mb4'
保存, service mysql restart ,检查字符集
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
2.设置rds参数, 在控制台 参数配置 中修改 character_set_server 参数为 utf8mb4。提交会自动重启(rds不会停止工作)
3.改库表编码:
ALTER DATABASE test_data_name CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4.django配置settings, DATABASES default添加 OPTIONS': {'charset':'utf8mb4'},
如果报错,是因为python-mysqldb包版本低于1.2.5,如实apt方式安装需要先删除:apt-get remove --purge python-mysqldb
再安装:pip install mysql-python
二、基础环境为python3,mysql8, django3.XX
1.首先不需要指定所有表为utf8mb4编码,只需要将所需表改变字符集即可,如存储微信昵称的表
ALTER TABLE appuser CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2.当这个model的__str__函数返回结果中包含存储存储emoji表情的字段时,会无法提交表单,例如
class AppUser:nickname = ...def __str__(self):return self.nickname #此字段含有emoji表情
admin后台会无法创建此AppUser的数据,原因在于django_admin_log为utf8编码,会报错
"Incorrect string value: '\\xF0\\x9F\\x98\\x8A' for column 'object_repr' at row 1"
此时只需要将将django_admin_log编码改为utf8mb4即可
ALTER TABLE django_admin_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3.使到RDS实例的会话连接为utf8mb4编码
django配置settings, DATABASES default添加 OPTIONS': {'charset':'utf8mb4'},
4.如果在获取数据时使用的requests包,务必将返回结果以utf8mb4为编码。
def method_get_api(url, query_string={}, json_loads=True):response = requests.get(url, query_string)response.encoding = 'utf8mb4' #解析emoji表情,必须加此行,否则存入数据库的数据不正确if json_loads:return json.loads(response.text)else:return response.text
这篇关于阿里云rds+django存储emoji utf8mb4(python2和python3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!