2012-04-13 4 views
1

私はtranslate関数を使って、検索アクセントを区別しないで処理します。これは、postgresの9.1と正常に動作しますが、9.0で動作しないようですPostgres 9.0 + translate関数とasciiコード

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.0には、私のコードはASCIIコードを使用して検索を実行し、それがインデックスを使用しないため...

がへの道があり、その後

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

によって

'\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' 

を置き換えるようですインデックス作成時にポストグルがアスキーコードを文字に変換しないようにするには?例えば

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 

答えて

1

ONに、PostgreSQLのstandard_conforming_stringsオプションのデフォルトはバージョン9.1から始まって。

これは、バックスラッシュ\文字がそのままの状態で扱われ、エスケープ記号として扱われないことを意味します。これは、SQLインジェクション攻撃を防ぐために行われます。これはSQL標準の推奨事項に従います。 \を使用して特殊文字を取得することはできますが、string constants内でのみ可能です。私は、これらのオプションが可能であり、仮定のPostgreSQLの9.1より前のバージョンの

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

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

  3. インデックスを作成する前に、セッションで最初に発行するコマンドとしてプレーンSET standard_conforming_strings TO on;を使用してください。

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

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

+0

ご協力いただきありがとうございます。 \ 303 \ 200 \ 303 \ 201 \ 303 \ 202 \ 303 \(...) 'を選択します。\ 303 \ 200 \ 303 \ 201 \ 303 \ 202 \ 303 \(...)' - >しかし、索引person_firstnamebegin_ci_ai_siを作成する人はbtree(translate(substr(upper)(firstname :: text、 ':: text、' :: text))、1、1)、 '\\ 303 \\ 200 \\ 303 \\ 201 \\ 303 \\ 202 \\ 303 \\ 203 \\ 303 \\ 204 \\ 303(...)単一のスラッシュでインデックスを作成しても、単純スラッシュの代わりにスラッシュ値を2倍したインデックスを作成します。 –

+0

PGADMINは単純スラッシュの代わりにダブルスラッシュを使用してインデックスを表示しますが、ご協力いただきありがとうございます –