[pgsql-jp: 26702] Re: encoding PGSQLとServlet

h-kato @ hokkaido.nsc-kk.co.jp h-kato @ hokkaido.nsc-kk.co.jp
2002年 7月 16日 (火) 17:54:41 JST


加藤です。 長文失礼します。

しかも[pgsql-jp: 26701]に対してなので混乱された方がいたらすいません。

> 郵便番号DBの元データは,郵政省の最新のものをWindows上にDownloadして
> 解凍したものをLinuxへFTPして nkf で SJIS-->>EUC変換をしたものを sed で
> 内容整形し,Postgres上で \copy --- using delimiters ','   としてDBへ取
> 込んだものです。
> ただこのDBは,SQL_ASCII 仕様でした。
> Linux上の psql コマンドラインで(実際はTeraTermの入力/出力EUC)で
> postal=> SELECT * FROM postal WHERE old_code = '100  ' ;
> 等とすると該当する東京の地域名が表示されます。
> このときのDBのSQL_ASCII仕様とはEUC_JPとどのような関係になるのでしょう?

--- ここだけ[pgsql-jp: 26693]から一部引用 ---
> としています。servlet側は常時SJISにして置きたいと考えています
これが有ったので、SJISで登録しちゃったのかな?と早合点してました。
こう読みかえれば良いだけかな?

SQL_ASCIIなので内部処理は無し(全て無加工)。
そのため、不正な状態(EUC_JP)のままDBに登録されていた。
データ取り出し時も全て無加工(結果としてEUC_JP)。

# EUC_JPで登録されているから正常と思うかもしれませんが、initdbでは
# SQL_ASCIIで作成されたのですから、不正という意味です。
# PostgreSQL自体は8ビットデータも受け付けるようなので、不正といいきる
# までも無さそうな気もしますけど.

無加工のまま取り出した結果をTeraTermがEUC_JPと解釈して、日本語が表示
されたという事でしょう。
逆にいえば、SJISなデータを\copyして、TeraTermの送受信コードもSJISにして
しまえば理屈は一緒かと..当然LANG等の環境変数も...

# 実は大昔に間違ってSJISのままデータを登録した事が有るんですよ..
# SELECTしたらSJISっぽい結果だったので、ターミナルの設定をSJISにしたら
# 見事に表示されました。これを正常とは言いたくないです。

> つまり,Servletでは自動エンコーディング変換してくれない,が,CSEや
> ACCESSでは自動変換してくれる。

多分MS-Access等では自動変換していないと思います。
ODBCは殆ど使っていなかったので外しているかもしれませんがPostgreSQL用に
日本語対応したODBCドライバが有りましたよね。
その中でEUC <=> SJIS変換をしているという記事を目にした事が有るような?
(ODBCとは縁遠いので、かなり自信無し)

> とりあえず,当面の問題は解決できましたのでこのままでも良いのですが。

結局言いたいのは、どこでコード変換されているか正確に把握していないと
痛い目に会いやすいという事です。

# 最後に一点。件名/行長/全文引用等が気になりました。
# 中村さんのケースと違い、Windowsクライアントは正常?なのですから..
# 続くと思っていなかったので、前回はそのままにしておきましたが、
# スレッド表示される人も多いので元々の記事につなげておきます。
# これを機に、ここを読まれてはどうでしょう。
# http://www.hyuki.com/writing/techask.html

# 加藤



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