Как изменить тип сортировки для столбца MySQL?
У меня есть utf-8 Vs. проблемы с байтовой строкой, упомянутые здесь: Головная боль Django с простой строкой без ascii
Мне не нужно учитывать совпадение с учетом регистра в столбцах MySQL, я просто хочу, чтобы строки UTF-8 возвращались, потому что я считаю, что невозможно обработать строки байтов, возвращенные для столбцов символов для текста, отличного от ascii.
Как мне изменить свой тип сортировки MySQL, чтобы строки UTF-8 всегда возвращались через Django?
Ответы
Ответ 1
Вам нужно знать настройки набора символов/сортировки на уровнях базы данных/таблицы/столбца. Настройки уровня столбца имеют приоритет над другими. Из-за этого я включаю команды, которые вы можете использовать для выполнения этих изменений на каждом уровне 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;
Ответ 2
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
Ответ 3
Обратите внимание: если вы действительно хотите изменить сортировку только для одного столбца (я не могу думать, почему вы можете, но кто знает), тогда это синтаксис для изменения столбца TEXT
с именем DESCRIPTION
в ITEMS
таблица в UTF-8, двоичная, непустая:
ALTER TABLE ITEMS CHANGE DESCRIPTION DESCRIPTION TEXT CHARACTER SET utf8
COLLATE utf8_bin NOT NULL;
В большинстве случаев не выполняется сортировка UTF-8 с учетом регистра, но в большинстве случаев работает сортировка utf8_bin
.
Ответ 4
В 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;'),
]