目录

    1. 什么是 utf8

    理论上,utf8 使用 1-6 个字符,

    实际上,最新的 utf8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

    2. 什么是 utf8mb4

    utf8mb4 是 utf8 的超集,理论上原来使用 utf8,然后将字符集修改为 utf8mb4,也不会对已有的utf8 编码读取产生任何问题。

    3. MySQL 中的 utf8

    MySQL 中的 utf8,只支持最长三个字节的 utf8 字符,也就是 Unicode 中的基本多文本平面。

    仅使用三个字符的原因可能是,基本多文种平面之外的字符很少用到。

    而在 MySQL 5.5.3 版本后,要在 Mysql 中保存 4 字节长度的 UTF-8 字符,就可以使用 utf8mb4 字符集了。例如可以用 utf8mb4 字符编码直接存储 emoj 表情,而不是存表情的替换字符。

    4. Django 解决 \xF0\x9F\x90\xAF 错误

    如果在 MySQL 的 utf8 字符集上写入表情字符,就会提示 Incorrect string value: ’\xF0\x9F\x90\xAF’ for column ... 错误。

    解决办法就是,修改表中相关列或表的编码格式,然后在 Django 中配置访问数据库编码方式。由于 utf8mb4 是 utf8 的超集,兼容 utf8 的数据,不需要修改原来的数据,就可以正常的使用了。

    4.1 修改 MySQL 编码

    查看表结构编码

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

    回显

    +--------------------------+-------------------+
    | Variable_name            | Value             |
    +--------------------------+-------------------+
    | character_set_client     | utf8              |
    | character_set_connection | utf8              |
    | character_set_database   | latin1            |
    | character_set_filesystem | binary            |
    | character_set_results    | utf8              |
    | character_set_server     | latin1            |
    | character_set_system     | utf8              |
    | collation_connection     | utf8_general_ci   |
    | collation_database       | latin1_swedish_ci |
    | collation_server         | latin1_swedish_ci |
    +--------------------------+-------------------+
    

    修改表结构字符,按需修改

    # 修改某个数据库
    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;
    # 修改某个表
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    # 修改某列
    ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
    

    4.2 Django 升级到 utf8mb4 配置

    DATABASES = {  
        'default': {  
            ...
            'OPTIONS': {'charset':'utf8mb4'},  
        },  
    }  
    

    4.3 修改 MySQL 配置[可选]

    C:\ProgramData\MySQL\MySQL Server 5.6\my.ini

    [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  
    

    5. 参考