我正在努力从我的表中转换编码错误的数据。例如,我有一个字段Nadège
应该是Nadège
.
我尝试使用 Postgres 的函数convert
, convert_from
,convert_to
但没有取得多大成功。
db=# SHOW client_encoding;
client_encoding
-----------------
UTF8
(1 row)
db=# SHOW server_encoding;
server_encoding
-----------------
UTF8
(1 row)
db=# SELECT "firstName", encode("firstName"::bytea, 'hex') FROM contact;
firstName | encode
-----------+--------------------
Nadège | 4e6164c3a86765
Nadège | 4e6164c383c2a86765
(2 rows)
db=# SELECT "firstName", convert_from("firstName"::bytea, 'latin1') FROM contact WHERE "lastName" ILIKE 'crochard';
firstName | convert_from
-----------+----------------
Nadège | Nadège
Nadège | NadÃ\u0083¨ge
(2 rows)
db=# SELECT "firstName", convert("firstName"::bytea, 'utf8', 'latin1') FROM contact;
firstName | convert
-----------+------------------
Nadège | \x4e6164e86765
Nadège | \x4e6164c3a86765
(2 rows)
使用 python 我可以得到正确的编码:
data.encode('latin1').decode('utf8')
关于如何在 postgres 中转换这些错误编码的数据的任何提示?
正如您已经正确识别的那样,
Nadège
UTF-8 表示Nadège
错误地解码为 ISO-8859-1(“latin-1”)。然后,在您的情况下,重新编码为 UTF-8 以存储在数据库中。要修复它,您需要:
所以:
Python 等价物将接近您编写的内容,但以 unicode 表示开始,以说明 PostgreSQL 将所有内容存储在数据库编码中。就像是:
您尝试的所有解决方案的问题在于从
text
tobytea
的转换使用数据库编码。因此,您从 utf-8 错误解码为 latin-1 的 utf-8 表示的字节开始。使用演员表,您必须写:因为在重新解释为 latin-1 并再次解码之前,您必须明确解码演员产生的 utf-8 表示。
你只需要使用
convert_to(mycol, 'latin-1')
而不是mycol::bytea