我trying to import some data进入我的数据库。所以我创建了一个临时表,
create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));
现在我正在尝试导入the data,
copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv
但后来我收到了错误,
ERROR: invalid byte sequence for encoding "UTF8": 0xc92c
我该如何解决?我是否需要更改整个数据库的编码(如果是,如何?)或者我是否可以仅更改tmp
表的编码?或者我应该尝试更改文件的编码吗?
答案 0 :(得分:101)
如果需要在数据库中存储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
您可以按照Character Set Support上的说明更改psql(客户端)编码。在该页面上,搜索短语“启用自动字符集转换”。
答案 1 :(得分:45)
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';
在我的案例中添加encoding
选项。
答案 2 :(得分:11)
显然我可以随时set the encoding,
set client_encoding to 'latin1'
然后重新运行查询。不知道我应该使用什么编码。
latin1
使角色清晰可辨,但大多数重音角色都是大写的,而不应该是大写的。我认为这是由于编码错误,但我认为它实际上只是糟糕的数据。我最终保留了latin1编码,但是预处理数据并修复了套管问题。
答案 3 :(得分:8)
如果您可以放弃不可转换的字符,可以使用-c
标记
iconv -c -t utf8 filename.csv > filename.utf8.csv
然后将它们复制到您的表格
答案 4 :(得分: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]”
如果您删除了错误的字符,请检查您是否确实需要转换文件:可能问题已经解决。
答案 5 :(得分:4)
这取决于导入文件生成的机器/编码类型。
如果您是从英语版或西欧版Windows获得它,最好的选择可能是将其设置为“WIN1252”。如果您从其他来源获取,请参阅此处的字符编码列表:
http://www.postgresql.org/docs/8.3/static/multibyte.html
如果您是从Mac上获取它,则可能必须先通过“iconv”实用程序运行它,然后将其从MacRoman转换为UTF-8。
答案 6 :(得分:4)
我遇到了同样的问题。什么解决了我的问题是:
在Excel中点击另存为。 从保存类型中,选择 .csv 点击工具。然后从下拉列表中选择网络选项。 在编码标签下,将文档另存为 Unicode(UTF-8)。单击确定。 保存文件。完成!
答案 7 :(得分: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。
答案 8 :(得分:2)
您可以使用sed。
替换反斜杠字符,例如管道符sed -i -- 's/\\/|/g' filename.txt
答案 9 :(得分:2)
按照以下步骤在pgadmin中解决此问题:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
答案 10 :(得分:2)
我在Windows下专门使用psql(没有图形工具)时遇到了这个问题。要解决此问题,请永久更改psql(客户端)的默认编码以匹配PostgreSQL服务器的默认编码。在CMD或Powershell中运行以下命令:
setx PGCLIENTENCODING UTF8
关闭并重新打开命令提示符/ Powershell,以使更改生效。
通过使用记事本打开备份文件并将其转到文件->另存为,将备份文件的编码从Unicode更改为UTF8。将编码下拉列表从Unicode更改为UTF8。 (也将“另存为”类型从“文本文档(.txt)”更改为“所有文件”,以避免将.txt扩展名添加到备份文件的名称中)。 现在,您应该能够还原备份了。
答案 11 :(得分:2)
我遇到了同样的问题:我的文件未编码为UTF-8。我已通过使用notepad ++打开文件并更改文件的编码来解决了该问题。
转到“编码”,然后选择“转换为UTF-8”。 保存更改,仅此而已!
答案 12 :(得分:1)
在 Excel 中打开您的 csv 文件,并将其保存为 utf8-csv 格式
答案 13 :(得分:1)
在Windows上使用pgadmin v4.4的替代原因:
具有非ASCII字符的列名将以某种方式弄乱psql
导入命令,并为您提供这种不直观的错误消息。您的UTF8 csv数据可能还不错。
解决方案:
重命名您的字段。
示例:
"Résultat" -> resultat
答案 14 :(得分:1)
在PHP中解决此问题的简短示例-
JOIN
错误详细信息:由于POSTGRES数据库无法处理UTF-8字符以外的其他字符,因此当我们尝试将给定输入上方的内容传递给列时,其给出的错误为“用于编码“ UTF8”的无效字节序列:0xab”。
因此,只需在插入POSTGRES数据库之前将该值转换为UTF-8。
答案 15 :(得分:1)
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';
你可以尝试这个来处理UTF8编码。
答案 16 :(得分:1)
对于python,您需要使用
班级pg8000.types.Bytea(str) Bytea是一个str派生类,它映射到PostgreSQL字节数组。
或
Pg8000.Binary(价值) 构造一个包含二进制数据的对象。
答案 17 :(得分:1)
如果输入数据包含转义字符本身,则可能会发生此错误。默认情况下,转义字符为" \"符号,所以如果你的输入文字包含" \" character - 尝试使用ESCAPE选项更改默认值。
答案 18 :(得分:0)
通过Notepad ++打开文件CSV。选择菜单Encoding
\ Encoding in UTF-8
,然后手动修复几个单元格。
然后再次尝试导入。
答案 19 :(得分: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 >> ...
在下一页中,它询问您是要从表中复制数据还是要编写查询。如果表中有char
或varchar
数据类型,请选择查询选项并将这些列转换为nvarchar(max)
。例如,如果myTable
有两列,其中第一列是varchar
,第二列是int
,则我将第一列转换为nvarchar
:
select cast (col1 as nvarchar(max)) col1
, col2
from myTable
答案 20 :(得分:0)
当我尝试将Excel生成的csv复制到Postgres表(所有在Mac上)时,我遇到了同样的错误。这就是我解决它的方法:
1)打开Atom中的文件(我使用的IDE)
2)对文件进行无关紧要的更改。保存文件。撤消更改。再次保存。
的Presto!复制命令现在有效。
(我认为Atom以一种有效的格式保存了它)
答案 21 :(得分:0)
此错误也很可能是字段已加密到位。确保您正在查看正确的表格,在某些情况下,管理员将创建一个您可以使用的未加密视图。我最近遇到了一个非常类似的问题。
答案 22 :(得分:0)
一些lolutions可能非常sambles
comlun 名字中有空格会导致这个问题
查看每列名称
例如
"colum_name "
#>rong
"colum_nam"
#>对