- 締切済み
sjisでのあいまい検索を教えてください
Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
> データベースのエンコーディングを【EUC_JP】に変更しないとだめでしょうか? 【SQL_ASCII】では、マルチバイト文字がマルチバイト文字として認識されないので、難しいと思います。 WHERE句などに日本語が有る場合、予期しない動作することもあるでしょう。 特にSJISを扱う場合は、エスケープ文字(5Ch)を含む文字の後ろに\を加えるなどの処置しないと、構文エラーを引き起こすこともあります。 例えば、下記の様なSQLの場合、構文エラーになってしまうと思います。 select * from aaa where name like '%パソ'; 【SQL_ASCII】でないとだめということですが、どういった理由でしょうか? 【SQL_ASCII】のままで無理に日本語を扱う方法を探すよりは、【EUC_JP】もしくは【UNICODE】にする方法を考えたほうが良いかと思います。
- root139
- ベストアンサー率60% (488/809)
PostgreSQLでSJISを扱う場合は、まず、データベースのエンコーディングを【EUC_JP】にします。 その上で、アプリケーション側で、クライアントエンコーディングをSJISに設定すれば、PostgreSQLが自動的に文字セットを変換してくれます。 http://www.postgresql.jp/document/pg802doc/html/multibyte.html このようにすると、データベースに格納される日本語の文字列はEUCですが、アプリケーション側で取出されるものはSJISになります。 お尋ねのあいまい検索も問題なく処理できます。 DB作成コマンド 例 ------------------------------------------------ createdb -E EUC_JP test_db ------------------------------------------------------------------ PHPアプリケーション 例 ------------------------------------------- $conn = pg_connect('host=localhost dbname=test_db user=test_user password=test_pw'); pg_set_client_encoding($conn, 'SJIS'); ------------------------------------------------------------------ データベースのエンコーディングは、Unicodeでも良いと思います。
補足
データベースのエンコーディングを【EUC_JP】に変更しないとだめでしょうか? 事情がありまして、エンコーディングは【SQL_ASCII】で ないとだめなのですが・・・。