【问题标题】:MySQLdb not setting tables to UTF-8MySQLdb 未将表设置为 UTF-8
【发布时间】:2018-03-04 08:29:33
【问题描述】:

我指定数据库应该是utf8mb4:

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

然后我运行一个脚本来创建表格并从一些平面文件中填充表格。这些文件具有latin1 字符,并以latin1 编码打开。 db 的表在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

【问题讨论】:

  • 这取决于您的创建表语法和您的全局 MySQL 编码。如果没有指定,全局默认将胜出

标签: python mysql django-models utf-8 iso-8859-1


【解决方案1】:

尝试使用以下查询。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

【讨论】:

  • 谢谢,但我不想对每个表都这样做。我想了解为什么表没有使用数据库的字符集。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    SHOW CREATE TABLE mytable
    

    (有一种方法可以使用information_schema.COLUMNS获取大量信息。)

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

    更多 Django 笔记:

    数据库 = { '默认': { '引擎': 'django.db.backends.mysql', ... '选项': { '字符集': 'utf8mb4', 'use_unicode':真,}, }, } 我的.cnf:

    [mysqld] 字符集服务器=utf8mb4 default-collat​​ion=utf8mb4_unicode_ci

    [客户端] 默认字符集=utf8mb4

    还有 Python 笔记:http://mysql.rjweb.org/doc.php/charcoll#python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-20
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2012-02-01
      相关资源
      最近更新 更多