MySQLdb 没有将表设置为 UTF-8

MySQLdb not setting tables to UTF-8

我指定数据库应该是 utf8mb4:

CREATE DATABASE IF NOT EXISTS MY_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后我 运行 一个脚本来创建表并从一些平面文件填充表。这些文件有 latin1 个字符,并以 latin1 编码打开。 数据库的表在 models.py 文件中指定,因为这是一个 Django 应用程序。 Django 文档说你像我创建数据库时那样指定编码。

数据加载,但在 MySQL Workbench 中,表格看起来是 'latin1':

SELECT
`tables`.`TABLE_SCHEMA`,
`tables`.`TABLE_NAME`,
`tables`.`TABLE_COLLATION`,
`collations`.`character_set_name`
FROM
`information_schema`.`TABLES` AS `tables`,
`information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
`tables`.`table_schema` = DATABASE()
AND `collations`.`collation_name` = `tables`.`table_collation`
;

query output

为什么表格看起来是 latin1,我怎样才能使它们成为 utf8mb4

尝试使用以下查询。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

原来 CREATE DATABASE... 命令在两个地方被调用。我正在编辑第二个,它没有被使用,因为数据库已经存在。当我将 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 添加到第一个 CREATE DATABASE 命令时,表格获得了正确的字符集。

table 的字符集和排序规则无关紧要;它只是添加新列时使用的默认值。重要的是列的设置。用这个找出来:

SHOW CREATE TABLE mytable

(有一种方法可以使用information_schemaCOLUMNS。)

数据是如何加载的?如果您(或代表您的 Django)使用 LOAD DATA INFILE,那么它是否有一个 CHARACTER SET 子句?需要这样说 data 的编码是什么。这 不需要 需要与数据将进入的列的字符集相同。

进一步的 Django 注释:

数据库 = { 'default':{ 'ENGINE': 'django.db.backends.mysql', ... 'OPTIONS':{ 'charset': 'utf8mb4', 'use_unicode':正确,}, }, } my.cnf:

[mysqld] 字符集服务器=utf8mb4 默认排序规则=utf8mb4_unicode_ci

[客户] 默认字符集=utf8mb4

和Python注释:http://mysql.rjweb.org/doc.php/charcoll#python