【问题标题】:Setting Django/MySQL site to use UTF-8将 Django/MySQL 站点设置为使用 UTF-8
【发布时间】:2023-03-07 05:52:01
【问题描述】:

我想将我的 Django 站点设置为以万无一失的方式为 MySQL 使用 UTF-8,无论 MySQL 安装是否使用 UTF-8 作为其默认设置。除了使用 UTF-8 编码创建表之外,我还在 settings.py 中的数据库初始化中添加了以下内容,以确保连接也使用 utf-8:

'OPTIONS': { 'init_command': 'SET storage_engine=INNODB; SET names "utf8"' }

这会导致错误:

_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

这样做的正确方法是什么?还有其他地方需要执行 SET NAMES 吗?

【问题讨论】:

    标签: mysql django utf-8


    【解决方案1】:

    您只需使用一次 SET 并将其他命令附加为:

    'SET storage_engine=INNODB,character_set_connection=utf8,collation_connection=utf8_unicode_ci'
    

    【讨论】:

      【解决方案2】:

      我所要做的就是把这个放到settings.py:

      'OPTIONS': { 'init_command': 'SET storage_engine=INNODB' }
      

      然后我自己在 MySQL 中创建了数据库:

      CREATE DATABASE my_database CHARACTER SET utf8;
      

      随后是所有 CREATE USERGRANT 调用。

      在那之后,./manage.py syncdb./manage.py migrate(因为我使用 South)完成了一切。

      到目前为止一切正常。也不必更改任何 MySQL 配置文件。 (系统管理员希望 MySQL 对其他用户默认使用 latin1 字符集。)

      【讨论】:

      • 对我有好处,在 db create 上更改它。
      • django.db.utils.OperationalError: (1193, "Unknown system variable 'storage_engine' 如何处理?
      • @Joannis 很抱歉后来的回复,但是 IIRC 更高版本的 MySQL 删除了 storage_engine 变量并默认为 InnoDB,因此您可以删除 init_command 选项,它应该可以工作。
      【解决方案3】:

      检查:http://blog.ionelmc.ro/2014/12/28/terrible-choices-mysql/

        'SET '
                      'storage_engine=INNODB,'
                      'character_set_connection=utf8,'
                      'collation_connection=utf8_bin,'
                      'SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
               }
      

      【讨论】:

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