MySQL Django 中使用字符集的小坑
在使用 Django 和 MySQL 的开发中,经常遇到一些关于字符集的问题。本文将结合实例,介绍在使用 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 的字符集,这里一般设置为 utf8mb4
。use_unicode
参数用于指定是否使用 Unicode 编码。一般设置为 True
。
但是这样设置还有一些坑需要注意。
坑一:collation_connection
与 collation_database
不一致
设置好字符集之后,会发现有时 MySQL 的表中的字符集还是默认的字符集,而不是设置的 utf8mb4
。这是因为 MySQL 存储数据时,需要同时考虑两个 collation 相关的参数:collation_connection
和 collation_database
。
其中 collation_connection
表示当前连接的字符集,而 collation_database
表示数据库的字符集。如果这两个字符集不一致,则 MySQL 就会按默认字符集存储数据。
解决这个问题,需要在 MySQL 中将 collation_connection
与 collation_database
都设置为 utf8mb4
。具体来说,可以执行以下 SQL 语句:
SET collation_connection = 'utf8mb4_unicode_ci';
SET collation_database = 'utf8mb4_unicode_ci';
一般来说,在 Django 中安装了 mysqlclient
或 PyMySQL
后,会默认将 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_connection
和collation_database
都设置为正确的字符集; - 使用 MySQL Connector/Python 版本 8.0.23 或更新版本,并确保使用的 MySQL 驱动支持
utf8mb4_unicode_520_ci
编码; - 注意字符集和编码的区别,使用正确的编码来支持 emoji 表情符号等特殊字符。