対象は「psqlが出力するメッセージ」の文字化け
Windowsで、psqlの日本語メッセージが文字化けする原因は2種類あるようです。
- Windowsの「地域と言語」が日本語以外になっている。(詳細:7月16日の記事)
- psqlが依存するintl.dllに問題がある。(PostgreSQL 9.4特有らしい)
今日の対策は後者向け。前者は、リンク先の記事に書いたとおり「地域と言語」を日本語にして直りました。一方後者は、諸々の設定変更だけでは解決したことがなく、結局intl.dllを別のに差し替えて(詳細:3月12日の記事)対策してました。でも、昨日の最後に書いたとおりPostgreSQL 9.5 Beta 1のpsqlは無事直っているので、それを使ってみたら?というのが今日の趣旨。intl.dllを差し替えるより簡単です。
以下、実行環境は次のとおり。PostgreSQL 9.4のマイナーバージョンは少し古いですが、9.4.4のポータブル版に付属のpsqlでもやっぱり文字化けしてました。
文字化けしてる例、しない例
PostgreSQL 9.4を日本語版のWindowsにインストールしてpsqlを起動すると、多くの場合こんな ↓ 文字化けになると思います。2行目はパスワード要求で、パスワード認証は普通に通り、その後の動作も正常ですがメッセージだけが変な状態。
$ psql -U postgres
繝ヲ繝シ繧カ postgres 縺ョ繝代せ繝ッ繝シ繝・
psql (9.4.1)
"help" 縺ァ繝倥Ν繝励r陦ィ遉コ縺励∪縺・
データベースに未接続でヘルプを表示しても ↓ 文字化けするので、PostgreSQL本体とは関係ない症状。他のコマンドラインツール、例えばpg_dumpもintl.dllに依存しているので同様です。
$ psql --version
psql (PostgreSQL) 9.4.1
$ psql --help
psql 縺ッ PostgreSQL 縺ョ莨夊ゥア蝙九ち繝シ繝溘リ繝ォ縺ァ縺吶・
菴ソ逕ィ譁ケ豕・
psql [繧ェ繝励す繝ァ繝ウ]... [繝・・繧ソ繝吶・繧ケ蜷・[繝ヲ繝シ繧カ蜷江]
(..)
先ほど書いたとおり動作そのものは正常で、日本語を含むクエリ発行やデータ取得は問題なく、最後の「1 行」の表示が「1 陦・」になるだけ。
SELECT repeat(chr(12411) || chr(12370), 10)
AS "データベースから返ってきた日本語文字列";
データベースから返ってきた日本語文字列
------------------------------------------
ほげほげほげほげほげほげほげほげほげほげ
(1 陦・
上のままでも用途によっては問題ありませんが、9.5 Beta 1のpsqlは直ってるので ↓ 日本語メッセージが正常に表示されます。他のコマンドラインツールも同様。
9.5 Beta 1付属のpsqlだけ準備して使う方法
方法といっても簡単で、EnterpriseDB社のDownload PostgreSQL Binariesから9.5.0 Beta 1をダウンロードし(下のzipファイル。32bitか64bitは適宜選んで下さい)適当なフォルダに解凍するだけ。
とりあえずbinとshareフォルダがあれば、日本語メッセージが正常に表示されて動きます。他にVisual C++のランタイムも必要ですが、既にPostgreSQL 9.4を使っているWindows環境なら既存のはず。今回、とくにpsql用にランタイムを追加したりは不要でした。なおshareフォルダに各言語のメッセージデータがあり、これを省くと常に英語(前に使ったGNU Octave付属のpsqlと同じ)。
psqlがサーバより新しくても、問題なさそう
ドキュメントのpsqlのページ、終わりの方にある「注釈」より。
psqlは、同じまたはより古いメジャーバージョンのサーバと稼働させることが最善です。 (..)
複数のメジャーバージョンが異なるサーバとの接続のためにpsqlを使用したいのであれば、psqlの最新版を使用することを勧めます。
メジャーバージョンというのは、例えば9.4と9.5の違い。一つ目のピリオドの次の数字です。9.4のサーバに対して9.5のpsqlを使うのは「より古いメジャーバージョンのサーバと稼働させる」ことで、問題ないというか最善とされてます。諸事情でベータ版を使えない場合、9.5が早く正式リリースされるといいですね。