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を使ってみると、思ってた以上に使いやすいです。
- psqlでUTF8が文字化けしない
- Linuxの起動が速い
- Windowsターミナルが使いやすい
- 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のファイルにアクセスできるようになります。