psqlで日本語が表示できません。


puttyターミナルからpsqlコマンドでDBの中をみたいのですが
select * from mytable; などを叩いても
値が日本語の部分だけ<AB><AC><AD>みたいな16進数表示になってしまいます。

DBのエンコーディングはEUC_JP
show client_encoding とすると SQL_ASCII だったので
ここを\encodingでEUC_JPに変えたのですが、状況は変わりませんでした。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/10/17 19:35:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント100pt

おそらく、psql が呼び出す less の問題だと思います。


試しに、下記のようにやってみて下さい。


$ echo "テスト" >test.txt

$ iconv -f utf8 -t euc-jp <test.txt > test.euc

$ less test.euc


上記は、デフォルトの言語環境が UTF-8 の場合です。nkf が使えるなら、iconv の代わりに「nkf -e test.txt >text.euc」でも構いません。


これで、似た様な表示になれば、less の問題の可能性が高いです。


回避策としては、下記のような方法が考えられます。

  • 「PAGER」という環境変数に、EUC-JP に対応した less、もしくは、EUC-JP に対応した別のページャープログラム(ぱっと思いつくのは lv)を使う。
  • クライアントのエンコーディングを、デフォルト言語環境に合わせる。UTF-8 であれば、「\encoding UTF8」としてみる。

client_encoding は、クライアントプログラムが入出力に使う文字コードを決めるものであって、データベースの文字コードと合わせる必要はありません。基本的には、文字コードの変換は、サーバプログラムとクライアントプログラムの間で自動的に変換されます。


文字セットサポート

id:dedara

回答ありがとうございます。

そもそもコマンドラインから日本語が入力できないようで、提示したくださったテスト手順も試せませんでした。

vimのエディタからであれば、日本語が入力できましたが、それをlessで開こうとすると「test.euc may be a binary file」と出て開けませんでした。

2011/10/17 14:57:37
  • id:JULY
    > そもそもコマンドラインから日本語が入力できないようで、

    ん? 基本的に putty でつながっている時の日本語入力は、クライアント側(って、多分、Windows ですよね?)での入力変換(Windows なら IME)なんで、ひょっとして、putty 上にカーソルがあると IME が有効にならない、という現象もあるんですか? それとも、サーバのコンソールで作業しようとしたら?

    直接入力できなくても、メモ帳か何かに入力しておいて、putty へコピー&ペーストでも出来ると思いますが、ペーストした時点で文字化けが起きているようだったら、そもそも putty 側の設定の問題があるかもしれません。

    ちなみに、使っている putty は Windows 上、という認識でまちがってませんか? あと、サーバ側で「echo $LANG」とした時の結果はどうなりますか? それと、サーバの OS が具体的に何か、教えていただけますか?
  • id:dedara
    windowsからputtyでfreebsdにつないでいる状態です。


    IMEは有効になってそうというかEnterを叩くまでは日本語が出ていますが、Enterを叩くと消えてしまうような感じです。メモ帳から貼り付けても、ペーストできませんでした。


    echo $LANG するとUndefined variableになりましたが。。
  • id:JULY
    > IMEは有効になってそうというかEnterを叩くまでは日本語が出ていますが、
    > Enterを叩くと消えてしまうような感じです。メモ帳から貼り付けても、
    > ペーストできませんでした。

    う~む。シェルが日本語の文字コードを受け付けていない、というか、無視している雰囲気に見えますね。putty としては、putty 上の設定(「変換」の所にある設定)に従ってサーバ側に送っているんだけど、シェルが、例えば ASCII コードの範囲外のコードが届くと、それらのデータが無視されているので、エコーバックされない(putty 上に入力した内容が表示されるのは、通常はサーバ側が入力されたデータを返す=エコーバックされるためで、サーバ側が無視して返さないと、putty 上でも「入力したものが表示されない」という状況になります)、といった状況に見えます。

    vim ではそのような事が起きない、ということは、サーバ側のシェルの問題でしょう。

    > echo $LANG するとUndefined variableになりましたが。。

    う~~~む。普通は、最悪でも「C」が設定されていそうな気がするんだけど....。FreeBSD って、そうなのかなぁ....。

    試しに、こんな風にしてみたらどうなります?

    ・putty の「変換」の設定で、UTF-8 になっている事を確認。
    ・putty の「変換」の設定に合わせて、環境変数 LANG を設定。
     例)
      $ LANG=ja_JP.UTF-8
      $ export LANG
    ・psql を実行
    ・「\encoding UTF8」として、クライアント側の文字コードを UTF-8 にする。
    ・日本語が返ってくるクエリーを実行する。

    ちなみに、FreeBSD のバージョンは分かりますか? ものすごく古いと、less が UTF-8 に対応していない、とか、そもそも OS として UTF-8 に対応していない、といった可能性も無いわけではないです。さすがに、そんな事は無いと思いますが....。
  • id:dedara
    ありがとうございます。
    LANGを設定することでうまくいきました!
  • id:JULY
    > そもそもeucなのでバージョンについては問題なさそうです。

    すみません、この意味が分からなかったです。

    OS の言語環境を EUC-JP として使っていた、ということでしょうか? であれば、LANG は ja_JP.eucJP になっているはずなのですが...。

    FreeBSD 8.2 なら、UTF-8 も使えるはず...。

    > 手順通りやって環境変数も変更も確認できましたが、
    > シェルから日本語の入力ができないのと、
    > psqlの表示については変わりなしですね。。

    シェルの日本語入力の問題は、ちょっと奥が深そうなので、先の手順では変わらないと思います。

    # ひょっとしたら、LANG を設定した後に、「sh」と打って、
    # 子供のシェルを立ち上げたら、一時的に直る?
    # もし直るのなら、.profile(sh 系)や .cshrc(csh 系)
    # で LANG を設定したら直るかも。

    う~ん、FreeBSD って lv は入っているのかなぁ...、PAGER という環境変数を lv に設定したら、PostgreSQL の client_encoding が EUC_JP でも大丈夫だと思うんだけど...
  • id:dedara
    すみません。
    最初 LANGにja_JP.euc-JPとしてしまい、うまくいかなかったのですが、
    ここをja_JP.eucJP(ハイフン取ったら)うまくいきました。

    問題ないと書いたのは、utfは使ってなかったのでバージョンは関係ないかと思ったのです。

    無事解決できました。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません