
Contents
- クエリ時に起きる時の原因、対策(Windows
コマンドプロンプト以外) - 対策(Windows
コマンドプロンプトの場合) - COPY
コマンドでのデータインポート時に起きる場合 - 似たエラー「符号化方式
"UTF8" で無効なバイトシーケンスです」が出る場合
クエリ時に起きる時の原因、対策(Windows コマンドプロンプト以外)
データベースの文字コードが例えば上の画像では、最初に「あ」という文字をユニコードコードポイント(10
このように事前に「クエリ結果に
とは言え、Windows
(psqlメタコマンド) \encoding -- 現在のクライアントエンコーディングを確認 \encoding utf8 -- 変更
Windows

(SQLコマンド) select current_setting('client_encoding'); -- 現在のクライアントエンコーディングを確認 set client_encoding to 'utf8'; -- 変更
対策(Windows コマンドプロンプトの場合)
問題はこれ…。以前いろいろ試した結果、コマンドプロンプト上のなおConEmuでコマンドプロンプトを使っても解決しません(変わるのは外観や操作性だけ)。最新の
Windows 10のコマンドプロンプトでも、利用できる文字コードはANSI(英語モード)かShift-JIS(日本語モード)のみ。UTF-8などは特にサポートされていない。
pgAdmin
-- クライアントエンコーディングがUTF-8でないと失敗 copy ( select chr(12354) union all select chr(12436) ) to 'R:/temp.txt'; ERROR: character with byte sequence 0xe3 0x82 0x94 in encoding " UTF8" has no equivalent in encoding "SJIS" -- クライアントエンコーディングをUTF-8にして成功 \encoding utf8 copy ( select chr(12354) union all select chr(12436) ) to 'R:/temp.txt'; COPY 2


COPY コマンドでのデータインポート時に起きる場合
クエリの時は「UTF-8エラーの様子を簡単に再現するため ↓ こんな感じで準備。文字コード
show server_encoding; +-----------------+ | server_encoding | +-----------------+ | UTF8 | +-----------------+ (1 行) create table test_import (str text); select * from pg_ls_dir('.') as fname where fname like '%.txt'; +----------+ | fname | +----------+ | sjis.txt | | utf8.txt | +----------+ (2 行)

↓ クライアントエンコーディングが
show client_encoding; +-----------------+ | client_encoding | +-----------------+ | SJIS | +-----------------+ (1 行) copy test_import from 'utf8.txt';ERROR: 符号化方式"SJIS"における0x86 0xe3バイトシーケンスを持つ文 字は"UTF8"符号化方式では等しくありません CONTEXT: test_importのCOPY。行番号 1 copy test_import from 'utf8.txt' (encoding 'utf8'); -- ファイルの文字コードを指定すればOK select * from test_import; +------------+ | str | +------------+ | あいうえお | +------------+ (1 行)

似たエラー「符号化方式 "UTF8" で無効なバイトシーケンスです」が出る場合
こちらは「ファイルが\encoding utf8 show client_encoding; +-----------------+ | client_encoding | +-----------------+ | UTF8 | +-----------------+ (1 行) set lc_messages to 'English'; copy test_import from 'sjis.txt';ERROR: invalid byte sequence for encoding "UTF8": 0x82 CONTEXT: COPY test_import, line 1 set lc_messages to 'Japanese'; copy test_import from 'sjis.txt';ERROR: 隨ヲ蜿キ蛹匁婿蠑・UTF8"縺ァ辟。蜉ケ縺ェ繝舌う繝医す繝シ繧ア繝ウ繧ケ 縺ァ縺・ 0x82 CONTEXT: test_import縺ョCOPY縲り。檎分蜿キ 1 copy test_import from 'sjis.txt' (encoding 'sjis'); -- ファイルの文字コードを指定すればOK

↓ 最後に、COPY
select * from test_import; +------------+ | str | +------------+ | 縺ゅ>縺・∴縺・| | 縺ゅ>縺・∴縺・| +------------+ (2 行) \encoding sjis select * from test_import; +------------+ | str | +------------+ | あいうえお | | あいうえお | +------------+ (2 行)
