↓ こんなエラー。クエリの内容に関わらずNot enough memoryと言われて拒否されます。WindowsUTF-8のコンソールでpsqlを使うと常に起きるようで、対策は(1)コンソールのコードページを変える(2)クエリがASCIIだけならコマンド「\pset pager off」でページャ不使用にする、のどちらかしか無さそう。WinpsqlUTF-8を使う展望が見えなくてちょっと残念。
Contents


問題の再現
下記の実行環境で試し、どれも同じ結果でした。

以下、最初の環境での例で、スクリーンキャプチャ画像はConEmuです。psql起動前からコンソールのコードページ(文字コード)を65001(UTF-8)にし、データベースサーバに接続すると警告が出て、どんなクエリもNot enough memory.と拒否されます。
> chcp 65001
Active code page: 65001

> psql -U postgres
psql (9.4.1)
WARNING: Console code page (65001) differs from Windows code page (932)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
Type "help" for help.

postgres=# SELECT 1;
Not enough memory.


接続時の同様の警告は、Shift JIS(日本語版Windowsのコードページ)以外のコンソールから接続すると常に出ます。
昨日のWIN1252でもそうでしたが、クエリ実行は問題なかったので、Not enough memoryエラーはWindowsUTF-8コンソール上のpsql固有の現象だと思います。

psql起動後にchcpコマンドでコードページをUTF-8に変えても ↓ 同じ結果でした。psql内では\!に続けて普通のコンソールコマンドを打てるので、それでchcpを実行しています。(画像は省略)
> psql -U postgres
psql (9.4.1)
"help" でヘルプを表示します.  <-こう出れば、通常のShift JISで接続してる

postgres=# SELECT 1;
 ?column?
----------
        1
(1 行)  <-ここまで正常

postgres=# \! chcp 65001  <-コードページ変更(ここで画面クリアされる)
Active code page: 65001

postgres=# SELECT 1;
Not enough memory.  <-やっぱりエラー


対策1:コンソールのコードページを変える
WindowsコンソールをShift JISに戻せば(いったんpsqlを終了するか、psql上で\! chcp 932を打つ)Not enough memoryは出なくなり、普通にクエリが通ります。コンソールをあえてUTF-8にする特段の事情、例えばShift JISにない文字を入力したい等がなければ、これで解決。
postgres=# \! chcp 932  <-実行直後、画面クリアされる
現在のコード ページ: 932

postgres=# \encoding SJIS  <-念のため

postgres=# SELECT chr(12362) || chr(12431) || chr(12426);
 ?column?
----------
 おわり
(1 row)


対策2:ページャを不使用にする(クエリがASCIIのみの場合)
Not enough memoryというエラーは、psqlが出力してるのではなくWindowsのページャであるmore.comが出したもの(参考: Mailing List Archive: Python)。冒頭に書いたとおり、psql内のコマンド「\pset pager off」でページャ不使用にでき、結果としてNot enough memoryエラーは出なくなります。ただし日本語など非ASCIIを含むコマンドやクエリを打つとpsqlが強制終了するので、対策として使える範囲は限定的。
postgres=# \! chcp  <-確認
Active code page: 65001

postgres=# SELECT 1;  <-問題の確認
Not enough memory.

postgres=# \pset pager off
Pager usage is off.

postgres=# \encoding SJIS  <-これないと、何故かクエリ結果の日本語が文字化け

postgres=# SELECT chr(12362) || chr(12431) || chr(12426);
 ?column?
----------
 おわり
(1 row)  <- ASCIIのみのクエリは一応実行できてる

postgres=# SELECT 'あいうえお';
\q  <- psqlが落ちた


上の例ではクエリを投げてますが、ただコンソールに文字を表示するだけのコマンド「\echo あいうえお」とかを打ってもpsqlが落ちました。


MySQL5.6以降はWindowsコンソールでUTF-8を使えるらしい
WinpsqlUTF-8コンソールの問題は、公式のメーリングリスト等で既に議論されてるけど(例えば下記の一つ目)どうも進展してなさそう。二つ目・三つ目のリンク先などを見るとWindowsのコマンドプロンプトでUTF-8を使うこと自体、問題が多くて難しいのかも。

»pgsql-bugs -- BUG #6161: Not enough memory error in psql with UTF8 console
» コマンドプロンプトでutf-8は、まだ無理らしい…
» コマンド「chcp 65001」を実行してコマンドプロンプトの文字エンコードをUTF-8にしたけど日本語表示で苦戦したお話


でもMySQL
5.6以降では、下の記事(2014年)を見ると既にWindowsコマンドラインからUTF-8のクエリを実行できるらしいです。Win版の歴史の違いか、それとも力点の置き方が違うのかな……その分、PostgreSQLにはpgAdminがあるわけで。どうしてもCUIがいいならCygwinで、ということ?

» 配電盤-- mysql.exeUTF-8を使う