64

開発のために MySQL データベースをローカルで実行していますが、Postgres を使用する Heroku にデプロイしています。Heroku はほとんどすべてを処理しますが、大文字と小文字を区別しない Like ステートメントは大文字と小文字を区別します。iLike ステートメントを使用できましたが、ローカルの MySQL データベースでは処理できません。

MySQL と Postgres の両方と互換性がある、大文字と小文字を区別しないクエリを作成する最良の方法は何ですか? または、アプリが通信している DB に応じて、Like ステートメントと iLike ステートメントを別々に記述する必要がありますか?

4

11 に答える 11

74

この話の教訓は次のとおりです。開発と運用に異なるソフトウェア スタックを使用しないでください。一度もない。

dev で再現できないバグが発生するだけです。あなたのテストは無価値になります。やらないでください。

別のデータベース エンジンを使用することは問題外です。LIKE とは異なる動作をするケースがはるかに多くなります (また、データベースで使用されている照合順序を確認しましたか?それらはすべての場合で同一ですか?そうでない場合は、できます同じように機能する varchar 列の ORDER BY を忘れてください)

于 2009-10-11T14:47:06.707 に答える
58
select * from foo where upper(bar) = upper(?);

呼び出し元でパラメーターを大文字に設定すると、2 番目の関数呼び出しを回避できます。

于 2008-10-15T01:16:19.450 に答える
36

アレルを使用:

Author.where(Author.arel_table[:name].matches("%foo%"))

matchesILIKEPostgres、およびLIKEその他すべてに演算子を使用します。

于 2012-04-13T23:15:00.760 に答える
13

postgres では、次のことができます。

SELECT whatever FROM mytable WHERE something ILIKE 'match this';

MySQLに相当するものがあるかどうかはわかりませんが、いつでもこれを行うことができますが、これは少し醜いですが、MySQLとpostgresの両方で動作するはずです:

SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');
于 2008-10-15T01:21:33.170 に答える
8

いくつかの答えがありますが、どれも非常に満足のいくものではありません。

  • LOWER(bar)= LOWER(?)はMySQLとPostgresで機能しますが、MySQLではひどく実行される可能性があります。LOWER関数のため、MySQLはインデックスを使用しません。Postgresでは(LOWER(bar)に)機能インデックスを追加できますが、MySQLはこれをサポートしていません。
  • MySQLは(大文字と小文字を区別する照合を設定していない限り)大文字と小文字を区別しない照合を自動的に実行し、そのインデックスを使用します。(バー=?)。
  • データベース外のコードから、barフィールドとbar_lowerフィールドを維持します。ここで、bar_lowerにはlower(bar)の結果が含まれます。(これは、データベーストリガーを使用しても可能です)。( Drupalでこのソリューションの説明を参照してください)。これは不器用ですが、少なくともほとんどすべてのデータベースで同じように実行されます。
于 2012-06-20T12:14:25.847 に答える
5

REGEXP は大文字と小文字を区別せず (BINARY で使用しない場合)、次のように使用できます...

    SELECT id FROM person WHERE name REGEXP 'john';

...'John'、'JOHN'、'john' などに一致します。

于 2012-07-31T22:30:01.820 に答える
2

PostgreSQL 8.4を使用している場合は、citextモジュールを使用して、大文字と小文字を区別しないテキストフィールドを作成できます。

于 2010-03-05T16:19:33.533 に答える
2

COLLATEを使用します。

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivevity.html

于 2012-04-27T15:37:46.520 に答える
1

ブロック内の部分文字列に一致させたい場合は、postgres で ~* を使用することもできます。~ は大文字と小文字を区別する部分文字列に一致し、 ~* は大文字と小文字を区別しない部分文字列に一致します。操作は遅いですが、検索には役立つかもしれません。

Select * from table where column ~* 'UnEvEn TeXt';
Select * from table where column ~ 'Uneven text';

どちらも「Some Uneven text here」にヒットします。前者だけが「Some UNEVEN TEXT here」にヒットします。

于 2011-01-12T00:59:18.337 に答える
1

また、 LIKE/ILIKEの切り替えを行うsearchlogicプラグインを確認することも検討してください。

于 2009-10-11T14:41:45.797 に答える
0

最もよく使用される3つのRailsデータベースバックエンドと互換性のある構文をカバーしているため、upperへの変換が最適です。PostgreSQL、MySQL、SQLiteはすべてこの構文をサポートしています。アプリケーションまたは条件文字列で検索文字列を大文字にする必要があるという(マイナーな)欠点があり、少し見苦しくなりますが、互換性が得られると価値があると思います。

MySQLとSQLite3の両方に、大文字と小文字を区別しないLIKE演算子があります。大文字と小文字を区別しない検索用に、大文字と小文字を区別するLIKE演算子とPostgreSQL固有の(マニュアルによる)ILIKE演算子を備えているのはPostgreSQLだけです。Railsアプリケーションの条件でLIKEの内側にILIKEを指定することもできますが、アプリケーションがMySQLまたはSQLiteで動作しなくなることに注意してください。

3番目のオプションは、使用しているデータベースエンジンを確認し、それに応じて検索文字列を変更することです。これは、ActiveRecordの接続アダプターをハッキング/モンキーパッチし、PostgreSQLアダプターにクエリ文字列を変更させて、クエリを実行する前に「ILIKE」を「LIKE」に置き換えることで改善できる可能性があります。ただし、このソリューションは最も複雑で、両方の用語を大文字にするなどの簡単な方法に照らして、これは努力に値しないと思います(ただし、この方法で行うとブラウニーポイントがたくさん得られます)。

于 2009-03-05T18:19:05.423 に答える