如何更改MySQL列的排序规则类型?

时间:2011-05-18 19:28:08

标签: mysql django utf-8

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

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

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

4 个答案:

答案 0 :(得分:25)

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


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

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;

答案 1 :(得分:5)

在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;'),
    ]

答案 2 :(得分:4)

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

ITEMS

没有区分大小写的UTF-8排序规则本身,但ALTER TABLE ITEMS CHANGE DESCRIPTION DESCRIPTION TEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL; 排序规则适用于大多数情况。

答案 3 :(得分:3)

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci