如何在MySQL和Postgres中编写不区分大小写的查询?

64

我在本地开发中运行MySQL数据库,但是部署到使用Postgres的Heroku时遇到了问题。 Heroku几乎处理所有内容,但是我的不区分大小写的Like语句变成了区分大小写。 我可以使用iLike语句,但是我的本地MySQL数据库无法处理。

有没有一种最佳方法编写不区分大小写的查询,可以兼容MySQL和Postgres?还是我需要根据我的应用程序连接的数据库编写单独的Like和iLike语句?


4
如果您在生产环境中使用Postgres,请在本地也使用Postgres。这不会是您遇到的第一个问题,而且这还意味着您无法利用任何Postgres特有的功能。 - Samuel Neff
也许在你提出这个问题时安装和运行Postgres很困难,但现在使用Docker运行Postgres非常容易。 - Andy
11个回答

0

将字符串转换为大写是最好的选择,因为它涵盖了三个最常用的Rails数据库后端的兼容语法。PostgreSQL、MySQL和SQLite都支持这种语法。它有一个(轻微的)缺点,就是你必须在应用程序或条件字符串中将搜索字符串转换为大写,使其看起来有点丑陋,但我认为你获得的兼容性使它值得。

MySQL和SQLite3都有一个不区分大小写的LIKE运算符。只有PostgreSQL有一个区分大小写的LIKE运算符和一个PostgreSQL特定的(根据手册)ILIKE运算符,用于不区分大小写的搜索。您可以在Rails应用程序的条件中指定ILIKE而不是LIKE,但请注意,在MySQL或SQLite下,该应用程序将停止工作。

第三个选项可能是检查您正在使用哪个数据库引擎,并相应地修改搜索字符串。这可能更好地通过黑客/猴子补丁ActiveRecord的连接适配器来完成,并让PostgreSQL适配器在查询执行之前修改查询字符串以将“LIKE”替换为“ILIKE”。然而,与简单地将两个术语转换为大写等更简单的方法相比,这种解决方案最为复杂,我认为这不值得努力(尽管您会因此获得很多赞誉)。


我开始开发一个类似的插件:http://github.com/myronmarston/case_insensitive_attributes这个插件还没有在任何生产环境中使用过,所以不要轻易在你的应用程序中使用它,但这是一个好的开始。 - Myron Marston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接