Несколько разных результатов, возвращаемых по чувствительному к регистру «точному» запросу в django - PullRequest
4 голосов
/ 18 марта 2011

У меня есть экземпляр django 1.2.1, работающий в Ubuntu с бэкэндом mysql 5. Я пытаюсь сделать запрос с учетом регистра, который должен возвращать только один результат, но я получаю два результата с одинаковым содержанием, но с разными случаями.

Я хочу получить запись со следующим заголовком: Синдром кота в интернете

Поэтому я использую следующий запрос:

c = Change.objects.filter(change_type='new',title__exact='Cat on the Internet syndrome')

и я получаю следующие результаты:

>>> c
[<Change: Change object>, <Change: Change object>]

Названия каждого объекта изменения:

>>> for i in c:
...     print i.title
... 
Cat on the Internet Syndrome
Cat on the Internet syndrome

Как вы можете видеть, S в синдроме в названии каждого объекта имеет другой случай для S в синдроме. Из прочтения документации [0] у меня сложилось впечатление, что все запросы по умолчанию имеют «точный» тип. Я получаю те же результаты, когда не указываю title__exact='Cat on the Internet syndrome'.

Как мне обеспечить использование чувствительности к регистру в запросе, который я описал выше?

[0] http://docs.djangoproject.com/en/dev/ref/models/querysets/#std:fieldlookup-exact

Edit: Mysql версия:

mysql  Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (i486) using readline 6.1

Ответы [ 3 ]

11 голосов
/ 18 марта 2011

http://code.djangoproject.com/ticket/2170

Чтобы получить функционально правильно, изменить сопоставление MySql? базы данных в latin1_swedish_cs или utf8_bin для чувствительного к регистру сравнения.

3 голосов
/ 18 марта 2011

Вероятно, это связано с настройкой на уровне MySQL. Из документации :

По умолчанию в базе данных UTF-8 MySQL будет использовать сортировку utf8_general_ci_swedish.Это приводит к тому, что все сравнения на равенство строк выполняются без учета регистра.То есть «Fred» и «freD» считаются равными на уровне базы данных.Если у вас есть уникальное ограничение для поля, было бы незаконно пытаться вставить и «aa», и «AA» в один и тот же столбец, поскольку они сравниваются как равные (и, следовательно, неуникальные) с сопоставлением по умолчанию.

Во многих случаях это значение по умолчанию не будет проблемой.Однако, если вы действительно хотите сравнение с учетом регистра для определенного столбца или таблицы, вы должны изменить столбец или таблицу, чтобы использовать сопоставление utf8_bin.

1 голос
/ 18 марта 2011

В приведенной вами ссылке относительно сравнения в MySQL есть примечание:

MySQL сравнения

В MySQL настройка таблицы сортировки таблицы базы данных определяет, будут ли точные сравнения чувствительными к регистру. Это настройка базы данных, а не настройка Django. Возможно настроить ваши таблицы MySQL для использования чувствительных к регистру сравнений, но здесь есть некоторые компромиссы. Для получения дополнительной информации об этом см. Раздел параметров сортировки в документации по базам данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...