编码“ UTF8”的字节序列无效

我将 试图导入一些数据输入到我的数据库中,因此我创建了一个临时表,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

现在我要导入 数据,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

但后来我发现了错误,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

我该怎么补救?是否需要更改整个数据库的编码(如果需要,如何更改?)或者我可以只改变 tmp表的编码吗?或者我应该尝试改变文件的编码?

442315 次浏览

这取决于生成导入文件的机器/编码类型。

如果你使用的是英文或西欧版本的 Windows,你最好的选择可能是将其设置为“ WIN1252”。如果你是从其他地方得到的,请参考这里的字符编码列表:

Http://www.postgresql.org/docs/8.3/static/multibyte.html

如果您从 Mac 上获得它,那么您可能必须首先通过“ iconv”实用程序运行它,以便将它从 MacRoman 转换为 UTF-8。

如果需要在数据库中存储 UTF8数据,则需要一个接受 UTF8的数据库。您可以在 pgAdmin 中检查数据库的编码。只需右键单击数据库,并选择“属性”。

但是这个错误似乎在告诉您源文件中有一些无效的 UTF8数据。这意味着 copy实用程序已经检测到或猜测到您正在向它提供一个 UTF8文件。

如果您正在运行某种 Unix 变体,您可以使用 file实用程序检查编码(或多或少)。

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(我认为这在终端的 Mac 上也可以实现)不确定在 Windows 下如何做到这一点。

如果对来自 Windows 系统的文件(即用 UTF8编码的 没有文件)使用相同的实用程序,它可能会显示如下内容:

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

如果情况仍然很奇怪,您可能会尝试将输入数据转换为已知编码,或者更改客户端的编码,或者两者兼而有之。(我们确实在扩展我对编码的知识范围。)

您可以使用 iconv实用程序来更改输入数据的编码。

iconv -f original_charset -t utf-8 originalfile > newfile

您可以按照 字符集支持上的说明更改 psql (客户机)编码。在该页面上,搜索短语“以启用自动字符集转换”。

此错误意味着文件中的记录编码与连接不同。在这种情况下 iconv 可能返回错误,有时甚至无视//IGNORE 标志:

Iconv-f ASCII-t utf-8//IGNORE < b.txt >/a.txt

Iconv: 位置(某个数字)的非法输入序列

诀窍是找到不正确的字符并替换它:

Vim (您的文本文件) ,按下“ ESC”: 按钮并键入“ : goto (iconv 返回的数字)”

要查找非 ASCII 字符,可以使用以下命令:

Grep-color = ‘ auto’-P”[ x80-xFF ]”

如果您删除不正确的字符请检查,如果您真的需要转换您的文件: 可能问题已经得到解决。

psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

添加 encoding选项在我的情况下工作。

如果输入数据包含转义字符本身,则可能发生此错误。默认情况下,转义字符是“”符号,因此,如果您的输入文本包含“”字符-尝试使用 ESCAPE 选项更改默认值。

可以使用 sed 替换反斜杠字符,例如使用管道字符。

sed -i -- 's/\\/|/g' filename.txt

显然我可以在飞行中进行 设置编码,

 set client_encoding to 'latin1'

然后重新运行查询。但不确定我应该使用什么编码。


latin1使字符清晰易读,但大多数重音字符都是大写字母,这是它们不应该出现的地方。我认为这是由于错误的编码,但我认为实际上是数据的错误。我最终保留了 Latin1编码,但预处理了数据并修复了大小写问题。

这个错误也很有可能使字段就地加密。确保您正在查看正确的表,在某些情况下,管理员将创建一个未加密的视图,您可以使用这个视图。我最近遇到了一个非常相似的问题。

我也面临着同样的问题,解决我问题的方法是:

在 Excel 中单击“另存为”。 从另存类型中选择 。 CSV 单击 工具,然后从下拉列表中选择 网站选项。 在 编码中选项卡下,将文档保存为 Unicode (UTF-8)。单击“确定”。 保存文件,完成!

按照下面的步骤在 pgadmin 中解决这个问题:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;

我也遇到了同样的问题,并且找到了一个不错的解决方案: Http://blog.e-shell.org/134

这是由于数据库编码不匹配造成的,肯定是因为从中获取 SQL 转储的数据库被编码为 SQL _ ASCII,而新的数据库被编码为 UTF8。..重新编码是 GNU 项目中的一个小工具,它允许您动态更改给定文件的编码。

所以我在回放之前重新编码了转储文件:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

在 Debian 或 Ubuntu 系统中,可以通过软件包安装重新编码。

当我试图将 Excel 生成的 csv 复制到 Postgres 表(全部在 Mac 上)时,也出现了同样的错误。我是这么解决的:

1)在 Atom (我使用的 IDE)中打开 File

2)在文件中做一个无关紧要的更改。保存文件。撤消更改。再次保存。

很快,复制指令成功了。

(我认为 Atom 以一种有效的格式保存了它)

对于 python,您需要使用

类 pg8000.type. Bytea (str) Bytea 是一个 str 派生类,映射到 PostgreSQL 字节数组。

或者

Pg8000.Binary (value) 构造一个保存二进制数据的对象。

copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

您可以尝试这样处理 UTF8编码。

如果可以放弃不可转换的字符,那么可以使用 -c标志

iconv -c -t utf8 filename.csv > filename.utf8.csv

然后拷贝到你的桌子上

通过记事本 + + 打开文件 CSV。选择菜单 Encoding Encoding in UTF-8,然后手动修复少量单元格。

然后再试试导入。

用 PHP-解决这个问题的简单例子

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

错误详细信息: 由于 POSTGRES 数据库不处理除 UTF-8字符以外的其他字符,当我们尝试将上述输入传递给一个列时,其给出的错误是“用于编码“ UTF8”的无效字节序列: 0xab”。

所以只要在插入 POSTGRES Database 之前将该值转换为 UTF-8即可。

如果您的 CSV 要从 SQLServer 导出,那么它非常庞大,并且具有 Unicode 字符,您可以通过将编码设置为 UTF-8来导出它:

Right-Click DB > Tasks > Export > 'SQL Server Native Client 11.0' >> 'Flat File Destination > File name: ... > Code page: UTF-8 >> ...

在下一页中,它询问您是要从表中复制数据还是要编写查询。如果表中有 charvarchar数据类型,请选择查询选项并将这些列强制转换为 nvarchar(max)。例如,如果 myTable有两根柱子,其中第一根是 varchar,第二根是 int,我就把第一根柱子投向 nvarchar:

select cast (col1 as nvarchar(max)) col1
, col2
from myTable

我也有同样的问题: 我的文件没有编码为 UTF-8。我已经通过使用记事本 + + 打开文件并更改文件的编码解决了这个问题。

转到“编码”并选择“转换为 UTF-8”。 保存更改,仅此而已!

我在 Windows 下专门使用 psql (没有图形工具)时遇到了这个问题。若要修复此问题,请永久更改 psql (客户端)的默认编码以匹配 PostgreSQL 服务器的默认编码。在 CMD 或 Powershell 中运行以下命令:

setx PGCLIENTENCODING UTF8

关闭并重新打开您的命令提示符/Powershell,以使更改生效。

将备份文件的编码从 Unicode 更改为 UTF8,方法是使用记事本打开该文件并执行 File-> Save As。将“编码”下拉列表从 Unicode 更改为 UTF8。(也可以从文本文档中更改“另存为”类型(。Txt)添加到所有文件,以避免添加。将 txt 扩展名添加到备份文件名中)。 现在应该可以还原备份了。

Windows 上 pgadmin v4.4的替代原因:

带有非 ASCII 字符的列名将以某种方式扰乱 psql导入命令,并给出这个不直观的错误消息。您的 UTF8 csv 数据可能没问题。

解决方案:

重命名字段。

例如:

"Résultat" -> resultat

有些洗剂可能是非常样品

我有任何空格在名称的 comlun 将导致这个问题

检查每个列的名称 举个例子 "colum_name " # > > 荣 "colum_nam" # > > 右

在 Excel 中打开 csv 文件,并将其保存为 Utf8-csv格式

更好地通过命令识别问题行:

grep -naxv '.*' source_data.txt