在向MySQL中直接插入Emoji后,查询出来的数据全部变成了问号,网上查了下大致原因是MySQL使用的utf8编码是三位的,但是一个Emoji表情需要四位,解决方法就是更改MySQL编码为utf8mb4。

需要MySQL版本>= 5.5.3,低版本不支持这个字符集。

1. 修改已存在数据库的编码

如果你的项目已经上线并不推荐直接修改已存在的数据库编码,有可能导致乱码问题,可以使用转码的方式存储。

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2. 新建数据库时指定编码

PS:新建数据库时最好显式的指出数据库编码,不要依赖数据库默认配置。

CREATE DATABASE `database` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 修改MySQL默认字符集

我的配置文件在/etc/my.cnf 这里的修改只对以后建立的数据库有效。

[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4

修改后需要重启MySQL服务生效。

4. 修改客户端的编码

Django项目可以参考:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'name',
        'USER':'username',
        'PASSWORD':'',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}