【问题标题】:How do you change the collation type for a MySQL column?如何更改 MySQL 列的排序规则类型?
【发布时间】:2011-08-28 08:17:59
【问题描述】:

我有 utf-8 Vs。这里提到的字节串问题:Django headache with simple non-ascii string

我不关心 MySQL 列中区分大小写的匹配,我只希望返回 UTF-8 字符串,因为我发现无法处理为非 ascii 文本的字符列返回的字节字符串。

如何更改我的 MySQL 排序规则类型,以便始终通过 Django 返回 UTF-8 字符串?

【问题讨论】:

  • 我发现不区分大小写的排序规则很奇怪;我期望我的字符串匹配是区分大小写的,除非我明确要求它们不要...无论如何,所有 UTF8 排序规则都有区分大小写和不区分大小写的变体,因此您仍然可以保留您喜欢的任何行为.

标签: mysql django utf-8


【解决方案1】:

在 django 中你必须编写自己的迁移:

./manage.py makemigrations --empty app_name

并使用这些 sql 命令填充空迁移,如下所示:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('app', '0008_prev_migration'),
    ]

    operations = [
        migrations.RunSQL('ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;'),
        migrations.RunSQL('ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;'),
        migrations.RunSQL('ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;'),
    ]

【讨论】:

  • 这有助于结合 David G 帖子中的 SQL。
  • 当您回滚到某些迁移时,它会提供... is not reversible。如何使用reverse_code=migrations.RunPython.noopRunSQL 操作?
  • @Hussain 你可以使用reverse_sql 作为RunSQL 中的第二个参数。 Elsewere 可以将RunSQL.noop 作为sqlreverse_sql 参数传递。 documentation
  • 是的。我想就是这样。但是我在这里读到我根本不需要更改字符集。 stackoverflow.com/a/1198655/1637867
【解决方案2】:

请注意,如果您确实只想更改一列的排序规则(我想不出您为什么会这样做,但谁知道),那么这是更改名为 DESCRIPTIONTEXT 列的语法ITEMS 表转 UTF-8,二进制,非空:

ALTER TABLE ITEMS CHANGE DESCRIPTION DESCRIPTION TEXT CHARACTER SET utf8
    COLLATE utf8_bin NOT NULL;

没有区分大小写的 UTF-8 排序规则本身,但 utf8_bin 排序规则适用于大多数情况。

【讨论】:

    【解决方案3】:

    您需要了解数据库/表/列级别的字符集/排序规则设置。列级设置优先于其他设置。因此,我包含了可用于在数据库的每个级别执行这些更改的命令。


    检查您当前的配置(数据库):

    SHOW CREATE DATABASE db_name;

    检查您当前的配置(表):

    SHOW TABLE STATUS WHERE name='tbl_name'

    检查您当前的配置(列):

    SHOW FULL COLUMNS FROM tbl_name;


    更改字符集/排序规则(数据库):

    ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;

    更改字符集/排序规则(表格):

    ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8;

    更改字符集/排序规则(列):

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

    【讨论】:

    • 评论@user1450663:正如官方声明here,Django 不支持通过ORM 进行排序操作的任何方式。
    • 表和列选项有什么区别?似乎他们俩都在更改整个表的排序规则
    【解决方案4】:
    ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
    

    【讨论】:

    • 虽然有用,但这只会更改新表的默认值,不会更改现有表的排序规则(这是 OP 需要的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2020-05-26
    • 2015-04-03
    • 2011-03-29
    • 2017-06-05
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多