WindowsのpsqlでUTF8が文字化けする問題に対処する

Windowsのpsqlを使ってデータベースサーバーに接続すると、UTF8形式のデータが文字化けします。何とかして文字化けを直したいのですが、どうしてもWindowsのpsqlを使うとUTF8が文字化けしてしまいます。

そこで、Windowsのpsqlを使うのを諦めて、WSLのLinuxでpsqlを使うことによって、UTF8文字化け問題に対処します。どうしてもWindowsのpsqlを使う必要がある場合は、この記事を読んでもUTF8が文字化けする問題は解決しません。

Windows版psqlの文字化けは直せない

初期状態だと、以下のようなエラーが出て、中のデータを見ることすらできません。

sampledata=# select * from sampletable;
ERROR:  符号化方式"UTF8"においてバイト列0xc2 0xa0である文字は符号化方式"SJIS"で等価な文字を持ちません

そこで、PostgreSQLのエンコードをUTF8に変更します。

sampledata=# \encoding
SJIS
sampledata=# \encoding utf8
sampledata=# \encoding
UTF8

これで、中のデータを見ることができるようなります。

ただし、文字化けしないのはデータベースサーバーに接続し、直接UTF8形式で作成したデータだけで、COPY\COPYでインポートしたデータの場合は文字化けします。

また、\dtコマンドでも文字化けしてしまいます。これは、WindowsPowerShellやPowerShellCoreのエンコードをUTF8に変更しても文字化けします。

sampledata=# \dt
                   リレーション一覧
 \x83X\x83L\x81[\x83} |  \x96\xBC\x91O  |     \x83^\x83C\x83v     | \x8F\x8A\x97L\x8E

Windows版のpsqlでWindows系以外のデータベースサーバーに接続する人が少ないのか、調べてもほとんど情報がなく解決方法がわかりません。

WSLのLinuxで接続する

どうしてもWindowsのpsqlでは文字化けを直せないので、Windowsのpsqlを使うのは諦めて、WSLのLinuxでpsqlを使います。

最終的な目標は、

Windowsマシンからデータベースサーバーに接続してデータを操作する

なので、個人使用目的ならWindowsのpsqlにもPowerShellにもこだわる必要がありません。

WSLのインストール

WSLでLinuxを使う方法は、Microsoftが詳しく説明してくれています。

Windows 10 用 Windows Subsystem for Linux のインストール ガイド

postgresql-clientのインストール

  • WSLのインストール
  • Linux ディストリビューション
  • Windows ターミナルのインストール(省略可能)

が終わったら、psqlを使えるようにするために、postgresql-clientをインストールします。私の場合は、データベースサーバーがDebianなのでWSLでもDebianをインストールしているので、Debianで説明します。

WSLのDebianを起動したら、

sudo apt install postgresql-client

インストールが終わったら、psqlが使えるか確認します。

$ psql -V
psql (PostgreSQL) 11.12 (Debian 11.12-0+deb10u1)

psqlのバージョンが表示されれば、OKです。

あとは、WSLのLinuxから、psqlにデータベースサーバーに接続すればUTF8での文字化け問題は解決します。

WindowsのpsqlでUTF8が文字化けするのを直したかったのに、解決策がWSLのLinuxを使う、というのはどうにも腑に落ちない面もありますが、いつまでもWindowsのpsqlにこだわっていても先に進めないので、素直にWSLのLinuxを使うことにします。

WSLのLinuxが使いやすい

WSLのLinuxを使ってみると、思ってた以上に使いやすいです。

  1. psqlでUTF8が文字化けしない
  2. Linuxの起動が速い
  3. Windowsターミナルが使いやすい
  4. Windowsのファイルにアクセスできる

ちょっと触ってみた感じでは、以上4点のメリットがあります。

Linuxの起動がすごく早く、私の環境ではWindowsターミナルを立ち上げて数秒で起動します。

Windowsターミナルは、WSLの機能ではありませんが、タブでLinuxとPowerShellを別に起動できるので便利です。また、あのWindowsPowerShellの驚くほど見にくい配色から解放されます。

WSLからWindowsのファイルにアクセス

WSLのLinuxでは、WindowsのCドライブは、/mnt/cにマウントされているので、WindowsのファイルもLinuxから操作できます。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        251G  463M  238G   1% /
tmpfs           6.3G     0  6.3G   0% /mnt/wsl
tools           466G  135G  331G  29% /init
none            6.3G     0  6.3G   0% /dev
none            6.3G  4.0K  6.3G   1% /run
none            6.3G     0  6.3G   0% /run/lock
none            6.3G     0  6.3G   0% /run/shm
none            6.3G     0  6.3G   0% /run/user
tmpfs           6.3G     0  6.3G   0% /sys/fs/cgroup
C:\             466G  135G  331G  29% /mnt/c
D:\             3.7T  133G  3.6T   4% /mnt/d

WindowsからWSLのファイルにアクセス

逆に、WindowsからWSLのLinuxにアクセスする場合は、エクスプローラーを開いてパスに\\wsl$と入力すると、Linuxのファイルにアクセスできるようになります。