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

mpe*_*pen 117 postgresql import

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

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

而现在我正在尝试导入数据,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv
Run Code Online (Sandbox Code Playgroud)

但后来我得到了错误,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我是否需要更改整个数据库的编码(如果是,如何?)或者我可以只更改tmp表格的编码吗?或者我应该尝试更改文件的编码?

Mik*_*ll' 105

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

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

如果您在Unix的某些变体下运行,则可以使用该file实用程序检查编码(或多或少).

$ file yourfilename
yourfilename: UTF-8 Unicode English text
Run Code Online (Sandbox Code Playgroud)

(我认为这也适用于终端上的Mac.)不确定如何在Windows下执行此操作.

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

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

如果事情变得奇怪,您可能会尝试将输入数据转换为已知编码,更改客户端编码,或两者兼而有之.(我们真的在扩展我对编码知识的限制.)

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

iconv -f original_charset -t utf-8 originalfile > newfile
Run Code Online (Sandbox Code Playgroud)

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

  • `iconv -t utf-8 bad-file> good-file`救了我的一天 (9认同)
  • 该文件是ASCII,但它包含重音字符,所以一定是错的? (3认同)
  • 将接受这个答案,但我认为问题实际上是数据(更新的Q). (2认同)
  • 我发现这很有帮助,谢谢。顺便说一句,它也可以在 OS X 终端上运行 (2认同)

Nob*_*obu 49

psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';
Run Code Online (Sandbox Code Playgroud)

添加encoding选项适用于我的情况.

  • 它将完成而不会出错,它可能会也可能不会提供有用的结果。您需要知道数据的预期编码。 (2认同)

mpe*_*pen 13

显然我可以动态设置编码,

 set client_encoding to 'latin1'
Run Code Online (Sandbox Code Playgroud)

然后重新运行查询.不知道我应该使用什么编码.


latin1使角色清晰易读,但大多数重音角色都是大写的,不应该是大写的.我认为这是由于编码错误,但我认为它实际上是坏的数据.我最终保留了latin1编码,但是预处理数据并修复了套管问题.


Abd*_*oui 12

如果你可以丢弃不可转换的字符,你可以使用-cflag

iconv -c -t utf8 filename.csv > filename.utf8.csv
Run Code Online (Sandbox Code Playgroud)

然后将它们复制到您的表中


小智 9

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

转到“编码”并选择“转换为 UTF-8”。保存更改即可!


Yur*_*sky 6

此错误意味着文件中的记录编码与连接不同.在这种情况下,iconv可能会返回错误,有时即使是// IGNORE标志:

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]"

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


小智 6

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

  1. SET client_encoding = 'ISO_8859_5';

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


Bob*_*obG 5

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

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

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

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


Vis*_*ani 5

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

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