Django创建了错误的MySQL LIKE语句

时间:2014-07-21 10:08:10

标签: python mysql sql django sql-like

我正在使用Django作为使用简单过滤系统的应用程序。我希望过滤器测试我的模型的标题是否包含查询字符串。

代码被剥离,看起来像这样:

cards = Card.objects.filter(title__icontains=query)

print cards.query

返回以下查询(再次,剥离不必要的东西):

SELECT [...] FROM `ygo_card_card`
WHERE `ygo_card_card`.`title` LIKE %dark%

即使它应该返回没有结果。当我手动运行此查询时,我得到了

  

SQL错误(1064):您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在'%dark%'附近使用在第1行

如果我在手动运行时将%dark%部分包装在撇号('%dark%')之间,它会按预期工作。在我看来,Django创建了一个不正确的查询。这是一个我可以通过设置控制的错误或其他东西吗?

任何搜索都会返回不相关的结果,因为相关的关键字过于通用。

我使用Django 1.6.5和MySQL 5.5.38,在Ubuntu Server 14.04 LTS上运行。

1 个答案:

答案 0 :(得分:1)

反应非常简单:我误解了这个问题。

问题来自一个潜在的问题:MySQL LIKE语句区分大小写或不敏感,具体取决于排序规则和使用的Django过滤器(icontainscontains)无效在结果中。您可以查看此bug ticket以获取更多信息。

正如Daniel Roseman指出的那样,.query属性不可靠,因为数据库驱动程序会进一步处理查询。这让我相信Django创建了一个错误的查询,而实际上它只是创建了一个区分大小写的搜索,它应该是不区分大小写的,因此缺乏结果。

最后,通过更改列,表和数据库的排序规则来解决问题。