文字コード「UTF-8」のPL/pgSQLのRAISEメッセージは、コマンドプロンプトの文字コードをchcpで変更しても文字化けが直りません。
この問題に対する対処方法を説明します。
1.結論
標準エラー出力をパイプを中継して標準出力します。
psql -U postgres -f foo.sql 2>&1 | find "" /v
「2>&1」で標準エラー出力を標準出力に追加、それをパイプで渡した先で「find "" /v」を使用してそのまま標準出力します。
パイプの先は渡された文字列をそのまま標準出力できるコマンドであれば何でも大丈夫です。
(more等。echoだと標準出力ではなくON,OFF切り替えになるのでNG。)
2.環境
・OS:Windows10
・コンソール:コマンドプロンプト
・DB:PostgreSQL 14.7
3.実行例
SQLファイル「foo.sql」
SET CLIENT_ENCODING TO 'UTF8';
DO $$
declare
begin
RAISE NOTICE 'テストメッセージ.';
end;
$$ language plpgsql;
コマンド
chcp 65001
psql -U postgres -f foo.sql 2>&1 | find "" /v
実行結果
SET
psql:foo.sql:8: NOTICE: テストメッセージ.
DO
4.補足
・上記で対応は可能ですが、以下の不明点があります。
- chcpで文字化けが直らない理由(RAISEメッセージが標準エラー出力であることが関係している?)
- 「2>&1」だけでは文字化けが解消されないが、パイプを中継すると文字化けが解消される理由。
・標準出力をファイル出力して参照する方法もあります。こちらの記事を参照下さい。
PL/pgSQLのRAISEメッセージをリダイレクトを使用してファイル出力する方法