我有utf-8 Vs.这里提到的字节串问题:Django headache with simple non-ascii string
我不关心MySQL列中的区分大小写匹配,我只是总是希望返回UTF-8字符串,因为我发现不可能处理为非ascii文本返回字符列的字节字符串。
如何更改MySQL排序规则类型以便始终通过Django返回UTF-8字符串?
答案 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