django 1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x81'

django mysql存储emoji表情 要使utf8mb4 格式

原来一般的字符包括中文用utf8的话,mysql是用3个字节去存储的,而emoji表情要用4个字节的utf8,也就是utf8mb4格式。

改变mysql 数据编码

liunx 修改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

windows 修改mysql的配置文件: mysql57/my.ini 添加:

[mysqld]  
#port 设置端口 ,默认3306 可不指明
#basedir 设置Mysql的安装目录  
#datadir 设置mysql数据库的数据的存放目录
port = 3309
basedir=C:\mysql57
datadir=C:\mysql57\data
# 允许最大连接数  
max_connections=200  
# 服务端使用的字符集默认为8比特编码的latin1字符集  
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎    
default-storage-engine=InnoDB
#开启查询缓存以避免 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated
explicit_defaults_for_timestamp=true

collation-server = utf8mb4_unicode_ci

[client]
#cmd.exe mysql命令行所用端口

port = 3309
default-character-set=utf8mb4

 


然后重启,mysql,查看mysql的编码

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

 

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

 

之后还是报错:查看了一下这部分的源代码,发现django/db/backends/mysql/base.py中的DatabaseWrapper类中有个kwargs的属性,里面有个key叫charset,默认值是utf8,
 


class DatabaseWrapper(BaseDatabaseWrapper):
    vendor = 'mysql'

    def get_connection_params(self):
        kwargs = {
            'conv': django_conversions,
            'charset': 'utf8',
        }
        if six.PY2:
            kwargs['use_unicode'] = True
        settings_dict = self.settings_dict
        if settings_dict['USER']:
            kwargs['user'] = settings_dict['USER']
        if settings_dict['NAME']:
            kwargs['db'] = settings_dict['NAME']
        if settings_dict['PASSWORD']:
            kwargs['passwd'] = force_str(settings_dict['PASSWORD'])
        if settings_dict['HOST'].startswith('/'):
            kwargs['unix_socket'] = settings_dict['HOST']
        elif settings_dict['HOST']:
            kwargs['host'] = settings_dict['HOST']
        if settings_dict['PORT']:
            kwargs['port'] = int(settings_dict['PORT'])

后面做数据库连接的时候,会用django的settings中,database的options去更新这一项。

settings 配置: 加上

'charset':'utf8mb4'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "gyf",
        'USER': 'root',
        'PASSWORD': "",
        'HOST': "127.0.0.1",
        'PORT': '3309',
        'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'             
        ,'charset':'utf8mb4'}
    }
}

 

然后再尝试插入emoji表情,OK

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值