0

2 つのデータベースがあり、1 つは postgresql 8.4 で実行され、もう 1 つは postgresql 9.1 で実行されています。どちらも同じロケールの CentOS マシン上にあります ( en_US)。

次のデータを含むテーブルがあるとします。

id | description
1    Morango
2    CAFÉ
3    pera
4    Uva

奇妙なことに、次のようなクエリを実行すると、次のようになります。

SELECT * FROM products WHERE description ~* 'café'

8.4 マシンでは結果が得られませんが、9.1 マシンでは行 ( CAFÉ) が得られました。どうやら大文字のユニコード文字を比較する方法が異なっているようです。

  1. 誰かがこの問題について私に洞察を与えることができますか?
  2. この問題を引き起こす可能性があるのは、別のバージョンの postgresql ですか?
  3. 2 台のマシンの動作を均等にするために追加できる構成はありますか?

更新: 両方のデータベースは UTF-8 です

4

1 に答える 1

2

非 US Unicode 文字の大文字と小文字を区別しない正規表現マッチングは、基本的に 9.0 より前ではサポートされていませんでした。

9.0 リリース ノートの次のスニペットを参照してください。

E.14.3.6. 関数
[...]
UTF-8 サーバーエンコーディングでロケール固有の正規表現処理をサポートします。 (Tom Lane)

ロケール固有の正規表現機能には、大文字と小文字を区別しない一致とロケール固有の文字クラスが含まれます。以前は、これらの機能は、データベースがシングルバイト サーバー エンコーディング (LATIN1 など) を使用している場合にのみ、非 ASCII 文字に対してのみ正しく機能していました。UTF-8 以外のマルチバイト エンコーディングでは、依然として誤動作します。

于 2013-06-05T21:02:23.633 に答える