你怎么写的情况不敏感的查询,为两MySQL and Postgresql?
-
03-07-2019 - |
题
我运行一个数据库当地的发展,但部署到选择使用Postgres。选择处理的几乎一切,但我的情况不像发言的情况下成为敏感。我可以使用干净。发言,但我的地方数据库不能处理那。
什么是最好的方式编写的情况不敏感的查询,同时兼容MySQL and Postgresql?或者我需要编写单独的像和声明干净。根据该数据库我的程序是说话?
解决方案
select * from foo where upper(bar) = upper(?);
如果在调用者中将参数设置为大写,则可以避免第二次函数调用。
其他提示
这个故事的寓意是:不要使用不同的软件堆栈进行开发和生产。从不。
你最终会得到你无法在开发中重现的错误;你的测试将毫无价值。只是不要这样做。
使用不同的数据库引擎是不可能的 - 会有更多的情况,它的行为与LIKE不同(同样,您是否检查了数据库使用的排序规则?在每种情况下它们是否相同?如果不是,你可以忘记在varchar列上工作的ORDER BY)
使用Arel:
Author.where(Author.arel_table[:name].matches("%foo%"))
matches
将使用Postgres的 ILIKE
运算符, LIKE
用于其他所有操作。
在postgres中,你可以这样做:
SELECT whatever FROM mytable WHERE something ILIKE 'match this';
我不确定是否有相同的MySQL,但你总是这样做有点难看,但应该适用于MySQL和postgres:
SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');
有几个答复,没有这些都是非常令人满意的。
REGEXP不区分大小写(除非与BINARY一起使用),并且可以像这样使用...
SELECT id FROM person WHERE name REGEXP 'john';
...匹配'John','JOHN','john'等等。
如果您使用的是PostgreSQL 8.4,则可以使用 citext 模块创建不区分大小写的文本字段。
您也可以考虑查看 searchlogic 插件,该插件执行 LIKE / ILIKE 为您切换。
如果要匹配块中的子字符串,也可以在postgres中使用〜*。 〜匹配区分大小写的子字符串,〜*不区分大小写的子字符串。它运行缓慢,但我觉得它对搜索很有用。
Select * from table where column ~* 'UnEvEn TeXt';
Select * from table where column ~ 'Uneven text';
两者都会点击“此处有些不均匀的文字” 只有前者会点击“这里有一些不均匀的文字”
转换为upper是最好的,因为它涵盖了3个最常用的Rails数据库后端的兼容语法。 PostgreSQL,MySQL和SQLite都支持这种语法。它有(次要的)缺点,你必须在你的应用程序或条件字符串中大写你的搜索字符串,使它有点丑,但我认为你获得的兼容性使它值得。
MySQL和SQLite3都有一个不区分大小写的LIKE运算符。只有PostgreSQL具有区分大小写的LIKE运算符和PostgreSQL特定的(根据手册)ILIKE运算符,用于不区分大小写的搜索。您可以在Rails应用程序的条件中指定LIKE的ILIKE insead,但请注意该应用程序将在MySQL或SQLite下停止工作。
第三个选项可能是检查您正在使用的数据库引擎并相应地修改搜索字符串。这可能通过入侵/ monkeypatching ActiveRecord的连接适配器并让PostgreSQL适配器修改查询字符串以替换“LIKE”来做得更好。对于“ILIKE”在查询执行之前。然而,这个解决方案是最复杂的,并且考虑到更容易的方式,如上限这两个术语,我认为这不是努力(尽管你这样做会获得大量的布朗尼点)。