1

翻訳機能を使用して、アクセントを区別しない検索を処理します。このリクエストを改善するために、一致するインデックスを作成しました:

CREATE INDEX person_lastname_ci_ai_si
ON person
USING btree
(translate(upper(lastname::text), '\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'::text, 'AAAAAAACEEEEIIIINOOOOOOUUUUYSaaaaaaaceeeeiiiinoooooouuuuyy'::text)
);

postgres 9.1 では問題なく動作しますが、9.0 では動作しないようです。Postgres 9.0 が置き換えられるようです

'\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿ

次に、私のコードはASCIIコードを使用して検索を実行するため、インデックスを使用しません..

index を作成するときに postgres が ASCII コードを文字に変換するのを避ける方法はありますか?

例えば ​​:

select '\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'

;

結果

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿ

どうすればこの結果を得ることができますか?

\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277
4

1 に答える 1

1

バージョン 9.1 以降、PostgreSQLstandard_conforming_stringsオプションのデフォルトはONです。

これは、バックスラッシュ\文字がエスケープ記号としてではなくそのまま扱われることを意味します。これは、SQL インジェクション攻撃を防ぐために行われます。これは、SQL 標準の推奨事項に従います。特殊文字を取得するために使用することは引き続き可能ですが、文字列定数\内でのみ可能です。

PostgreSQL の 9.1 より前のバージョンでは、次のオプションが可能であると思います。

  1. システム全体のstandard_conforming_stringsオプションを に変更しますON。ただし、これはクラスタ全体に影響し、他の領域で予期しない結果が生じる可能性があります。

  2. を使用して、ユーザーごとstandard_conforming_stringsにオプションを変更します。これにも副作用がある可能性があります。ALTER ROLE ... SET standard_conforming_strings TO on;

  3. SET standard_conforming_strings TO on;インデックスを作成する前に、セッションで発行する最初のコマンドとしてplain を使用します。

  4. ステートメントでリテラル\記号として扱われるように、すべてのバックスラッシュを 2 倍にします。CREATE INDEX ...

これが役立つかどうか教えてください。

于 2012-04-13T09:58:03.383 に答える