Django中区分大小写的'exact'查询返回多个不同结果

4 投票
3 回答
1286 浏览
提问于 2025-04-16 13:58

我在Ubuntu上运行着一个django 1.2.1的实例,后端使用的是mysql 5。我想做一个区分大小写的查询,应该只返回一个结果,但我却得到了两个结果,它们的内容相同,只是大小写不同。

我想要获取的条目标题是: Cat on the Internet syndrome

所以我使用了以下查询:

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

结果是:

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

每个Change对象的标题是:

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

你可以看到,每个对象标题中的“syndrome”这个词里的“S”字母大小写不同。我之前以为根据文档[0]的说明,所有查询默认都是“精确匹配”。当我不指定 title__exact='Cat on the Internet syndrome' 时,结果也是一样的。

我该如何确保在我上面提到的查询中使用区分大小写的匹配呢?

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

编辑: Mysql版本是:

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

3 个回答

1

你给的参考资料里提到了一些关于MySQL比较的内容:

MySQL的比较

在MySQL中,数据库表的“排序规则”设置决定了在比较时是否区分大小写。这是数据库的设置,而不是Django的设置。你可以配置你的MySQL表来进行区分大小写的比较,但这样做会有一些权衡和影响。如果想了解更多,可以查看数据库文档中的排序规则部分

3

这可能是因为MySQL的设置问题。根据文档

默认情况下,如果你的数据库是UTF-8格式,MySQL会使用utf8_general_ci_swedish这种排序规则。这意味着在比较字符串时,不区分大小写。也就是说,“Fred”和“freD”在数据库里被认为是相等的。如果你在某个字段上设置了唯一性约束,那么在同一列中插入“aa”和“AA”就会出错,因为它们在默认的排序规则下被视为相等(因此不唯一)。

在很多情况下,这个默认设置不会造成问题。不过,如果你确实想在某个特定的列或表中进行区分大小写的比较,你需要把那个列或表的排序规则改成utf8_bin。

11

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

为了让功能正常工作, 需要把MySql数据库的排序规则 改成latin1_swedish_cs或者 utf8_bin,这样才能进行区分大小写的比较。

撰写回答