Django项目中有一个Mysql数据表字段存储的是用户评论, 使用了系统默认的设置,导致用户提交文本中如果包含了emoji, 就会报错.

报错内容为:

1
django.db.utils.DataError: (1366, "Incorrect string value: '\\xF0\\x9F\\x90\\x82\\xE7\\x89...' for column 'content' at row 1")

原因是由于使用默认的数据库设置UTF-8, Mysql只支持三个字节的值. 但是emoji是4个字节.

解决办法:

  • 将存储改内容的字段设置为uft8mb4

    1
    ALTER TABLE table_name MODIFY colum_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 设置表的字符集

    1
    ALTER TABLE table_name CHARSET=utf8mb4;
  • 设置数据库字符集(可选)

    1
    SET NAMES utf8mb4;
  • django配置更改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # settings.py
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'xxxxxx',
    'USER': 'xxxxx',
    'PASSWORD': 'xxxxx',
    'HOST': '127.0.0.1',
    'PORT': 3306,
    'CONN_MAX_AGE': 180,
    'OPTIONS': {'charset': 'utf8mb4'},
    }
    }