web-dev-qa-db-ja.com

PostgreSQLデータベースから文字を削除すると、エンコーディングエラーが発生する

WIN1252エンコーディングを使用するPostgreSQL 10データベースがあります。

PgAdmin 4から選択を実行すると、私の列の1つに変換エラーを引き起こす値があります。

SELECT myfield FROM mydb.myschema."MYTABLE"

戻り値:

ERROR:  character with byte sequence 0x9d in encoding "WIN1252" has no 
equivalent in encoding "UTF8"
SQL state: 22P05

PgAdmin 4でクライアントエンコーディングをWIN1252に設定すると、データベースへの接続が切断されます(pgAdmin 4でクライアントエンコーディングの設定に問題があったことを覚えていますが、リンクを追跡します)。

Psqlを使用してクライアントエンコーディングをWIN1252に設定し、問題のある機能の1つを選択します。

SELECT myfield
FROM mydb.myschema."MYTABLE"
WHERE oid = 12345

戻り値:

“A sample comment

最初にDBにインポートされたデータを見ると、「中かっこ」が誤ってインポートされているようです。

これらの文字を列から削除する方法はありますか?それらを通常の引用符で置き換えるか、単に削除しますか?

2
Jesse Reilly

WIN1252文字セット https://en.wikipedia.org/wiki/Windows-1252 を見ると、その16進コード9Dに対応する文字はありません。 818D8F90についても同様です。

それがUTF8では「同等ではない」理由です。その文字はソースマップの最初の場所には存在しません。

WIN1252エンコーディングで構成されたセッションで表示または入力されても、エラーになりません。 cmd.exeの上にあるpsql.exeで適切なコードページ(chcp 1252)を使用すると、これらの文字が長方形のボックス内の疑問符として私の環境に表示されます。

とにかく、(WIN1252クライアントエンコーディングを使用する場合)次のようなステートメントでこれらを削除することをお勧めします。

UPDATE tablename SET field=replace(field, chr(x'9D'::int), '')
  WHERE strpos(field,chr(x'9D'::int))>0;

WIN1252がPgAdminで使用できない場合は、psqlを使用してください。これらの文字が削除されたら、後でUTF8クライアントエンコーディングに切り替えることができます。

1
Daniel Vérité

逆に読んでいると思います。代わりに、SET client_encodingをutf8;。

SET CLIENT_ENCODING TO 'utf8';
0
Evan Carroll