Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE
Posted
技术标签:
【中文标题】Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE【英文标题】:Django 2.0 - iexact translates to LIKE and not 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,谁错了?
顺便说一句:
我的 mysql 排序规则是 utf8_bin。
mysql 在 ubuntu 上提供服务。
代码正在 Windows 上运行。
【问题讨论】:
【参考方案1】:文档说hereiexact
的SQL 等效项是ILIKE
。它并没有说iexact
将在 MySQL 中转换为ILIKE
。这也是根本不可能的。 MySQL 没有ILIKE
。 LIKE
已经不区分大小写了。
在我使用的 PostgreSQL 中,iexact
转换为:
SELECT ... FROM "article" WHERE UPPER("article"."title"::text) = UPPER(hello world)
MySQL中exact
和iexact
的区别如下:
... WHERE `articles`.`title` LIKE hello world
... WHERE `articles`.`title` = hello world
【讨论】:
非常感谢。所以我可以理解iexact
在MySQL中等于=
,除了性能?
@NunchakusHuang 不,iexact
是 LIKE
,exact
是 =
。这与性能无关,而与大小写有关(不敏感与敏感)。
再次感谢你!我现在还有一个问题,正如你所说,LIKE
是case insenstive
。我将'collation' 更新为'utf8_bin',在MySQL 中的值为'Hello World',iexact='hello world'
仍然无法获取数据,为什么?
MySQL 中的 @NunchakusHuang utf8_bin
区分大小写,因此这是预期的行为。在开始使用排序规则之前,您必须了解它们的目的是什么。你想保存什么样的角色?你的用例是什么?请阅读documentation 并牢记:如果您不掌握规则,请不要违反规则。
@NunchakusHuang 如果你喜欢这个答案,你应该投票赞成这个问题:)以上是关于Django 2.0 - iexact 转换为 LIKE 而不是 ILIKE的主要内容,如果未能解决你的问题,请参考以下文章
python测试开发django-171.ORM查询之exact和iexact
如何链接 Django 的“in”和“iexact”查询集字段查找?