【问题标题】:Django 2.0 - iexact translates to LIKE and not ILIKEDjango 2.0 - iexact 转换为 LIKE 而不是 ILIKE
【发布时间】:2018-09-12 22:07:05
【问题描述】:

我有一个这样的模型:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    class Meta:
        db_table = 'article'

然后我编写查询:

articles = Article.objects.filter(title__iexact='hello world')
print(articles.query)

输出是:

SELECT ... FROM `article` WHERE `article`.`title` LIKE hello world

你可以看到iexact被翻译成LIKE。但是 django 文档说它会翻译成 ILIKE,谁错了?

顺便说一句:

  1. 我的 mysql 排序规则是 utf8_bin。

  2. mysql 在 ubuntu 上提供服务。

  3. 代码正在 Windows 上运行。

【问题讨论】:

    标签: mysql django django-models django-orm


    【解决方案1】:

    文档说hereiexact 的SQL 等效项是ILIKE。它并没有说iexact 将在 MySQL 中转换为ILIKE。这也是根本不可能的。 MySQL 没有ILIKELIKE 已经不区分大小写了。

    在我使用的 PostgreSQL 中,iexact 转换为:

    SELECT ... FROM "article" WHERE UPPER("article"."title"::text) = UPPER(hello world)
    

    MySQL中exactiexact的区别如下:

    • articles = Article.objects.filter(title__iexact='hello world')

    ... WHERE `articles`.`title` LIKE hello world

    • articles = Article.objects.filter(title__exact='hello world')

    ... WHERE `articles`.`title` = hello world

    【讨论】:

    • 非常感谢。所以我可以理解iexact在MySQL中等于=,除了性能?
    • @NunchakusHuang 不,iexactLIKEexact=。这与性能无关,而与大小写有关(不敏感与敏感)。
    • 再次感谢你!我现在还有一个问题,正如你所说,LIKEcase insenstive。我将'collat​​ion' 更新为'utf8_bin',在MySQL 中的值为'Hello World',iexact='hello world' 仍然无法获取数据,为什么?
    • MySQL 中的 @NunchakusHuang utf8_bin 区分大小写,因此这是预期的行为。在开始使用排序规则之前,您必须了解它们的目的是什么。你想保存什么样的角色?你的用例是什么?请阅读documentation 并牢记:如果您不掌握规则,请不要违反规则。
    • @NunchakusHuang 如果你喜欢这个答案,你应该投票赞成这个问题:)
    猜你喜欢
    • 2013-12-18
    • 2016-03-04
    • 2012-02-19
    • 2018-08-23
    • 2022-01-04
    • 2015-09-01
    • 1970-01-01
    • 2018-06-21
    • 2017-11-05
    相关资源
    最近更新 更多