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


124

我正在尝试将一些数据导入数据库。所以我创建了一个临时表,

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表的编码?还是应该尝试更改文件的编码?


更改导入时的编码选项。我将其设置为“ Windows-1251”,并且可以正常运行。
布莱恩D

1
谢谢@BrianD,我也面临着这个问题,这对我有用。
gouravkr

Answers:


109

如果需要在数据库中存储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(客户端)编码。在该页面上,搜索短语“启用自动字符集转换”。


3
说该文件是ASCII,但其中包含重音字符,因此一定是错误的吗?
mpen 2011年

2
会接受这个答案,但我认为问题实际上出在数据上(更新的Q)。
mpen 2011年

1
我发现这很有帮助,谢谢。顺便说一下,它也可以在OS X终端上运行
Raul Rene

1
这对我有用,但方式略有不同。“ iconv”命令实际上轰炸了我的文件,但是它确实在问题出在的位置-某种奇怪的“-”字符。无论如何,我删除了它,并且我的文件能够加载到postgres中。谢谢你的提示!
trip0d199

1
只是为了帮助其他人和搜索引擎:这可以将带有不可读字符的Stripe CSV导出转换回UTF-8:`iconv -f ISO-8859-15 -t utf-8customers.csv> customers-utf8.csv`
sscarduzio

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

添加encoding选项在我的情况下有效。


1
它会正确完成,它可能会也可能不会提供有用的结果。您需要知道数据的预期编码。
杰森

1
在我的情况下,上面的查询是如何工作的?我有用UTF8编码的csv文件和用UTF8编码的DB。
Ajay Takur's

14

显然,我可以随时设置编码

 set client_encoding to 'latin1'

然后重新运行查询。不知道我应该使用哪种编码。


latin1使字符清晰易读,但是大多数带重音的字符是大写的,不应该使用大写的。我以为这是由于编码错误所致,但我认为实际上这只是错误的数据。我最终保留了latin1编码,但是对数据进行了预处理并解决了大小写问题。


有趣的是,我在SELECT语句上遇到了错误!之所以解决了问题,是因为我的psql 客户端给出了错误,而不是数据库本身。(如果编码被禁止,那本来会拒绝数据的。)
Wildcard


8

此错误意味着文件的记录编码在连接方面有所不同。在这种情况下,即使// IGNORE标志,iconv有时也会返回错误:

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

iconv:位置的非法输入序列(一些数字)

诀窍是找到不正确的字符并将其替换。要在Linux上使用“ vim”编辑器,请执行以下操作:

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

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

grep --color ='auto'-P“ [\ x80- \ xFF]”

如果删除了不正确的字符,请检查是否确实需要转换文件:可能问题已解决。


iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt
杰森

5

请按照以下步骤在pgadmin中解决此问题:

  1. SET client_encoding = 'ISO_8859_5';

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


4

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

如果您从Windows的英语或西欧版本中获取它,则最好的选择是将其设置为“ WIN1252”。如果您是从其他来源获得的,请在此处查询字符编码列表:

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

如果要从Mac上获取它,则可能必须先通过“ iconv”实用程序运行它,才能将其从MacRoman转换为UTF-8。


4

好吧,我面临着同样的问题。解决我的问题的原因是:

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


3

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

这是由于您的数据库编码不匹配引起的,这肯定是因为您从中获得SQL转储的数据库被编码为SQL_ASCII,而新的数据库被编码为UTF8。.. Recode是GNU项目中的一个小工具,可让您即时更改给定文件的编码。

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

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

在Debian或Ubuntu系统中,可以通过软件包安装recode。



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

您可以尝试使用它来处理UTF8编码。


2

在PHP-中解决此问题的简短示例

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

错误的详细信息:当我们尝试将给定输入上方的值传递给列时,由于POSTGRES数据库不处理UTF-8字符,因此它给出的错误为“编码“ UTF8”的无效字节序列:0xab”。

因此,只需在插入POSTGRES数据库之前将该值转换为UTF-8。


2

我遇到了同样的问题:我的文件未编码为UTF-8。我已通过使用notepad ++打开文件并更改文件的编码来解决了该问题。

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


1

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


1

对于python,您需要使用

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

要么

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


1

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

setx PGCLIENTENCODING UTF8

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

通过使用记事本打开备份文件并将其转到文件->另存为,将备份文件的编码从Unicode更改为UTF8。将编码下拉列表从Unicode更改为UTF8。(也请将“另存为”类型从“文本文档(.txt)”更改为“所有文件”,以避免将.txt扩展名添加到备份文件的名称中)。现在,您应该能够还原备份了。


0

由于该错误,很可能对该字段进行了加密。确保您正在查看正确的表,在某些情况下,管理员将创建未加密的视图供您使用。我最近遇到了一个非常相似的问题。


0

当我尝试将Excel生成的csv复制到Postgres表(全部在Mac上)时,遇到了相同的错误。这是我解决的方法:

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

2)对文件进行微不足道的更改。保存文件。撤消更改。再次保存。

快点!复制命令现在可以使用了。

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


0

通过Notepad ++打开CSV文件。选择菜单Encoding\Encoding in UTF-8,然后手动修复几个单元格。

然后尝试再次导入。


0

如果要从SQL Server导出CSV,那么它很大,并且具有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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.