【问题标题】:django character set with MySQL weirdness带有 MySQL 怪异的 django 字符集
【发布时间】:2010-11-07 13:56:52
【问题描述】:

我看到了

OperationalError (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='")

看起来我的一些变量是 UTF8 字符串

'名称': 'p\xc7\x9d\xca\x87\xc9\x9f\xc4\xb1\xc9\xa5s 徽章'

这是配置问题吗?如果是这样,我该如何解决?我想用 Unicode 处理一切(我想)。

【问题讨论】:

    标签: mysql django django-models mysql-error-1267


    【解决方案1】:

    您将在 django 设置文件中添加选项,如下所示:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'OPTIONS': {'charset': 'utf8mb4'},
            'NAME': 'sarpanchDb',
            'USER': 'root',
            'PASSWORD': 'tiger',
            'HOST': 'localhost',
            'PORT': '',
        },
    }
    

    您还需要在 /etc/mysql/my.cnf 文件中进行更改

    [mysql]
    default-character-set=utf8mb4
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    

    然后重启mysql服务

    sudo service mysql restart
    

    使用以下查询交叉检查它是否有效

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR 
    Variable_name LIKE 'collation%';
    

    你应该得到以下输出

    +--------------------------+--------------------+
    | Variable_name            | Value              |
    +--------------------------+--------------------+
    | character_set_client     | utf8mb4            |
    | character_set_connection | utf8mb4            |
    | character_set_database   | utf8mb4            |
    | character_set_filesystem | binary             |
    | character_set_results    | utf8mb4            |
    | character_set_server     | utf8mb4            |
    | character_set_system     | utf8               |
    | collation_connection     | utf8mb4_unicode_ci |
    | collation_database       | utf8mb4_unicode_ci |
    | collation_server         | utf8mb4_unicode_ci |
    +--------------------------+--------------------+
    10 rows in set (0.00 sec)
    

    【讨论】:

    • 我缺少 mysql 配置文件,谢谢
    【解决方案2】:

    您可以通过 shell 更改表格编码:

    $ manage.py shell
    >>> from django.db import connection
    >>> cursor = connection.cursor()
    >>> cursor.execute('SHOW TABLES')
    >>> results=[]
    >>> for row in cursor.fetchall(): results.append(row)
    >>> for row in results: cursor.execute('ALTER TABLE %s CONVERT TO CHARACTER SET utf8 COLLATE     utf8_general_ci;' % (row[0]))
    

    https://mayan.readthedocs.org/en/v0.13/faq/index.html

    【讨论】:

    • 这很棒!但请记住,您的数据库字符集将保持原样,更改它也执行:ALTER DATABASE databasename CHARACTER SET utf8;
    • 您可能还需要更新每个表的,而不仅仅是数据库及其表。
    • 这很好用!警告:最后一行中的额外空格以某种方式弄乱了命令。删除它们以正确执行。
    【解决方案3】:

    您的数据库似乎默认为 latin1_swedish_ci,因此无法接受所有 utf8 字符。您需要更改 MySQL 数据库表的配置以使用 utf8_general_ci。可以在MySQL Performance Blog 找到一篇关于此的优秀博文(带有工具链接)

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2011-10-20
      • 2019-06-14
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多