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(客户端)编码.在该页面上,搜索短语"启用自动字符集转换".
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
选项适用于我的情况.
mpe*_*pen 13
显然我可以动态设置编码,
set client_encoding to 'latin1'
Run Code Online (Sandbox Code Playgroud)
然后重新运行查询.不知道我应该使用什么编码.
latin1
使角色清晰易读,但大多数重音角色都是大写的,不应该是大写的.我认为这是由于编码错误,但我认为它实际上是坏的数据.我最终保留了latin1编码,但是预处理数据并修复了套管问题.
Abd*_*oui 12
如果你可以丢弃不可转换的字符,你可以使用-c
flag
iconv -c -t utf8 filename.csv > filename.utf8.csv
Run Code Online (Sandbox Code Playgroud)
然后将它们复制到您的表中
此错误意味着文件中的记录编码与连接不同.在这种情况下,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 中解决此问题:
SET client_encoding = 'ISO_8859_5';
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
这取决于生成导入文件的机器/编码类型。
如果您从英语或西欧版本的 Windows 获取它,最好的选择可能是将其设置为“WIN1252”。如果您从其他来源获取它,请查阅此处的字符编码列表:
http://www.postgresql.org/docs/8.3/static/multibyte.html
如果您从 Mac 获取它,则可能必须先通过“iconv”实用程序运行它,以将其从 MacRoman 转换为 UTF-8。
好吧,我面临着同样的问题。解决我的问题的是:
在 Excel 中单击“另存为”。从保存类型中选择.csv 单击“工具”。然后从下拉列表中选择网络选项。在“编码”选项卡下,将文档另存为Unicode(UTF-8)。单击“确定”。保存文件。完毕 !
归档时间: |
|
查看次数: |
290525 次 |
最近记录: |