Django 2.0中iexact被转成LIKE而非ILIKE,与文档不符?
问题解答:Django
iexact 查询在MySQL下转为 LIKE 而非 ILIKE 的原因 其实这事儿两边都没毛病,是Django针对不同数据库的特性做的适配逻辑而已,具体来说:
ILIKE是PostgreSQL专属语法:MySQL本身并不支持ILIKE这个关键字,它的不区分大小写匹配是靠带_ci后缀的排序规则(比如你用到的utf8_general_ci、utf8_unicode_ci这类)来实现的——当表或字段使用这种排序规则时,普通的LIKE查询就会自动忽略大小写,效果和PostgreSQL的ILIKE完全一致。- Django会自动适配数据库语法:Django的ORM设计就是为了屏蔽不同数据库的语法差异。当你使用PostgreSQL作为后端时,
iexact会被转换成ILIKE;而当你切换到MySQL时,Django知道MySQL不支持ILIKE,就会自动转换成LIKE,同时依赖MySQL的排序规则来实现不区分大小写的匹配,这完全符合官方文档的设计意图(文档里说的ILIKE是针对PostgreSQL的情况)。
你可以实际测试一下:用iexact='hello world'查询时,不管输入的是Hello World还是HELLO WORLD,只要你的排序规则是_ci结尾的,都能被匹配到,这说明功能是正常的。
内容的提问来源于stack exchange,提问作者NunchakusHuang
相关产品推荐
相关产品推荐

