MySQL Django 中使用字符集的小坑

MySQL Django 中使用字符集的小坑

在使用 DjangoMySQL 的开发中,经常遇到一些关于字符集的问题。本文将结合实例,介绍在使用 Django 时,如何正确地设置 MySQL 的字符集来避免遇到字符集方面的问题,以及常见的一些字符集相关错误。

阅读更多:MySQL 教程

Django 中的字符集设置

首先,我们看一看 Django 中如何设置 MySQL 的字符集。

在 Django 的 settings 文件中,可以设置以下两个参数,来指定 MySQL 的字符集:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'use_unicode': True,
        },
    }
}

charset 参数用于指定 MySQL 的字符集,这里一般设置为 utf8mb4use_unicode 参数用于指定是否使用 Unicode 编码。一般设置为 True

但是这样设置还有一些坑需要注意。

坑一:collation_connectioncollation_database 不一致

设置好字符集之后,会发现有时 MySQL 的表中的字符集还是默认的字符集,而不是设置的 utf8mb4。这是因为 MySQL 存储数据时,需要同时考虑两个 collation 相关的参数:collation_connectioncollation_database

其中 collation_connection 表示当前连接的字符集,而 collation_database 表示数据库的字符集。如果这两个字符集不一致,则 MySQL 就会按默认字符集存储数据。

解决这个问题,需要在 MySQL 中将 collation_connectioncollation_database 都设置为 utf8mb4。具体来说,可以执行以下 SQL 语句:

SET collation_connection = 'utf8mb4_unicode_ci';
SET collation_database = 'utf8mb4_unicode_ci';

一般来说,在 Django 中安装了 mysqlclientPyMySQL 后,会默认将 collation_connection 设置为 utf8mb4。但是 collation_database 不会跟着一起修改,需要手动执行上面的 SQL 语句。

坑二:MySQL Connector/Python 版本问题

在将 Django 和 MySQL 连接时,有时也会遇到字符集设置不生效的问题。这是因为使用的是 MySQL Connector/Python 引擎,而当前版本的 MySQL Connector/Python 官方文档中并没有完全支持 utf8mb4 字符集。

目前来说,在使用 MySQL Connector/Python 8.0.23 以后的版本,已经支持 utf8mb4 字符集了。如果使用的是较早的版本,建议更新到 MySQL Connector/Python 8.0.23 或更新版本。

坑三:MySQL 驱动版本问题

在使用 MySQL 的 Python 驱动时,也会发现字符集设置不生效的情况。这是因为 MySQL 驱动在 connect() 方法中可以设置很多参数,而字符集相关的参数也并不固定。

具体来说,比如我们使用的是 PyMySQL 驱动,就可以通过以下方法来设置字符集相关的参数:

import pymysql

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='root',
    db='testdb',
    charset='utf8mb4',
    init_command='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
)

在连接 MySQL 数据库时,设置字符集参数为 utf8mb4,并在 init_command 参数中执行初始化 SQL 语句,让 MySQL 的 collation_connection 参数也设置为 utf8mb4

坑四:MySQL 中的编码问题

在使用 Django 和 MySQL 开发时,还需要注意 MySQL 中的编码问题。

在 MySQL 中,有两个概念需要区分:字符集和编码。字符集指的是字符集名称,比如 utf8mb4,而编码则指的是字符在计算机中的二进制表示,比如 utf8mb4_unicode_ci

如果字符集和编码不匹配,就会出现乱码等问题。

在设置 MySQL 字符集时,必须同时设置字符集和编码。一般来说,应该使用 utf8mb4_unicode_ci 来设置编码,这是 utf8mb4 字符集的默认编码。

坑五:emoji 表情符号的问题

在使用 Django 和 MySQL 开发时,有时也会遇到 emoji 表情符号无法正确存储的问题。

这是因为一些 emoji 表情符号并不属于 Unicode 字符集中的字符,而是属于 Unicode 的补充字符集中的字符。如果我们使用的 MySQL 版本不支持补充字符集,就会出现 emoji 表情符号无法正确存储的情况。

解决这个问题,需要在 MySQL 中使用 utf8mb4 字符集和编码,并设置 MySQL 的 utf8mb4_unicode_520_ci 编码,这是支持 Unicode 5.2 版本补充字符集的编码。同时,也需要确保使用的 MySQL 驱动和 MySQL Connector/Python 引擎都支持 utf8mb4_unicode_520_ci 编码。

总结

在使用 Django 和 MySQL 开发时,字符集设置是一个非常重要的问题。需要注意以下几点:

  • 在 Django 的 settings 文件中设置 MySQL 的字符集;
  • 确保 MySQL 的 collation_connectioncollation_database 都设置为正确的字符集;
  • 使用 MySQL Connector/Python 版本 8.0.23 或更新版本,并确保使用的 MySQL 驱动支持 utf8mb4_unicode_520_ci 编码;
  • 注意字符集和编码的区别,使用正确的编码来支持 emoji 表情符号等特殊字符。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程