[pgsql-jp: 34619] Re: selectがうまくできません

Katsuhiko Okano k_okano @ po.ntts.co.jp
2005年 1月 11日 (火) 14:14:32 JST


岡野と申します。


大道 裕 wrote:
(略)
> データベースは「SQL_ASCII」ですが、データは「EUC_JP」
> です。
>
> # pg_dump suiei > suiei.dump
> # psql suiei < suiei.dump
>
> # select namae from kiroku2 where namae='大道 裕';
>
> とすると、3文字の名前がすべてselectされます。
(略)


対策としては、tomsonさんの指摘の他にpsqlを起動した端末の文字コードも
確認したほうがいいと思います。


以下、私の環境で再現できなかったので想像なのですが、
考えるネタの1つになればと思って書きます。

1)psqlからデータベースに投げた検索条件にある文字列と、
2)データベースが比較のために内部でレコードをとりだした時の文字列が、
同じ文字列に文字化けしたのではないでしょうか?
片方だけ文字化けしているのであれば、検索結果は0件になると思います。
#ソースを見ていないので自信はありません(-_-;)

(*1)のページによると、
ASCIIの文字コードの範囲          :0x20-0x7E(1バイト)
EUC-JPの文字コードの範囲(漢字)   :0xA1-0xFE(1、2バイト目とも)
SHIFT-JISの文字コードの範囲(漢字):0x81-0x9F,0xE0-0xFC(1バイト目)、0x40-0x7E,0x80-0xFC(2バイト目)
と、EUC-JPの文字コードの範囲はASCIIの文字コードの範囲と重なりません。

例えば、
(A)'スポレク'は、
  EUC-JP   : A5 B9 A5 DD A5 EC A5 AF
  SHIFT-JIS: 83 58 83 7C 83 8C 83 4E (2,4,8バイト目がASCIIの範囲の'X','|','N')
(B)'市民大会'は、
  EUC-JP   : BB D4 CC B1 CW E7 B2 F1
  SHIFT-JIS: 8E 73 96 AF 91 E5 89 EF (2バイト目がASCIIの範囲の's')

それを踏まえて、
ASCII範囲外の文字が'?'に置き換わったとすると
(表示できないだけでなく勝手に置き換えられたとすると)
            'スポレク' :  '市民大会'
  EUC-JP   : ????????  ==  ????????
  SHIFT-JIS: ?X?|???N  <>  ?s??????

となり、EUC-JPでは同じ長さの全ての文字列がマッチし、
SHIFT-JISでは、一部の文字列しかマッチしない。という状況になるのではないでしょうか。
#この場合、EUC-JPでも同じ長さでもASCIIの範囲の異なる文字が含まれていれば
#同じ長さでもマッチしないはずです。
#また、SHIFT-JISの'スポレク'での検索結果は、
#'9榎ム丑'(82 58 89 7C 83 80 89 4E)の検索結果とも同じになるはずです。


(*1)のページ euc.jp/i18n/charcode.ja.html

長文ですいません。

-- 
----------------------------------------
Katsuhiko Okano
k_okano _at_ po.ntts.co.jp
NTT Software Corp. (division "NBRO-PT6")




pgsql-jp メーリングリストの案内