Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改MySQL列的排序规则类型?_Mysql_Django_Utf 8 - Fatal编程技术网

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

如何更改MySQL列的排序规则类型?,mysql,django,utf-8,Mysql,Django,Utf 8,这里提到了utf-8与字节字符串的问题: 我不关心MySQL列中的大小写敏感匹配,我只希望返回UTF-8字符串,因为我发现不可能处理为非ascii文本的字符列返回的字节字符串 如何更改MySQL排序规则类型,以便始终通过Django返回UTF-8字符串?您需要了解数据库/表/列级别的字符集/排序规则设置。列级设置优先于其他设置。正因为如此,我包含了可以用于在数据库的每个级别执行这些更改的命令 ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 CO

这里提到了utf-8与字节字符串的问题:

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


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

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

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

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

显示创建数据库db\u名称

检查当前配置(表):

在name='tbl\u name'处显示表格状态

检查当前配置(列):

显示tbl_名称中的完整列


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

alterdatabasedb\u name默认字符集utf8

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

ALTER TABLE tbl\u name默认字符集utf8

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


将表格tbl\u名称转换为字符集utf8

请注意,如果您真的只想更改一列的排序规则(我不知道您为什么会这样做,但谁知道呢),那么这就是将
ITEMS
表中名为
DESCRIPTION
文本列更改为UTF-8、二进制、非空的语法:

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

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

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

我发现不区分大小写的排序规则很奇怪;我希望我的字符串匹配区分大小写,除非我明确要求它们不要。。。无论如何,所有UTF8排序规则都有区分大小写和不区分大小写的变体,因此您仍然可以保留您喜欢的任何行为。虽然这很有用,但它只会更改新表的默认值,而不会更改现有表的排序规则(这是OP需要的)。Comment@user1450663:正如官方所述,Django不支持通过ORM进行排序操作。表选项和列选项之间有什么区别?似乎他们两个都在改变整个表的排序规则这与David G的文章中下面的SQL结合起来很有帮助。。。不可逆
。如何将
reverse\u code=migrations.RunPython.noop
RunSQL
操作一起使用?@Hussain您可以使用
reverse\u sql
作为
RunSQL
中的第二个参数。Elsewere可以将
RunSQL.noop
作为
sql
reverse\u sql
param传递。对我想就是这样。但是我在这里读到,我根本不需要改变字符集。