今天(20140108)去公司从新测试了下,添加下报错信息和另外一个场景:linux
这个问题是在公司环境下出现的,在我的环境中没有重现,在公司是做个记录吧。sql
过程:数据库
1,在windows环境下把一个linux环境数据库DB1的t1数据导到另外一个Linux环境数据库DB2的t1:windows
pg_dump -a -h 189.139.1.111 -t test1 -U gpadmin postgres|psql –h 189.139.1.106 -U postgres postgres服务器
报错,导数不成功(encoding GB18030 has no equivalent in UTF8 line 2)post
2,改用copy测试
登陆DB1ui
\copy (select * from test1) to e:/test1.txt编码
切换至DB2spa
\copy test1 from e:/test1.txt
报错,提示最后一个字段数据类型不对(invalid input syntax for type date “N”(seg0 solsvr:50001…) context:copy test1 line 53 etl_date)
3,检查没有发现什么问题,尝试只导入test1.txt一条记录,另存为test1_1.txt
\copy test1 from e:/test1_1.txt
居然成功了
4,这时想到应该是dos和unix格式问题,把test1.txt用ue由dos转换为unix
\copy test1 from e:/test1.txt
成功
--(表没有设惟一键,因此屡次导入也不会报错)
5,使用pg_dump -a -h 189.139.1.111 -t test1 -U gpadmin postgres|psql –h 189.139.1.106 -U postgres postgres也报错,为何呢?
当时想到加上数据编码提示:
pg_dump –a – E GBK -h 189.139.1.111 -t test1 -U gpadmin postgres|psql –h 189.139.1.106 -U postgres postgres
成功
6.另外一个场景
建立一个表只有一个Int数据类型字段,使用以上pg_dump不加编码参数也成功。
这是什么状况?导出文件是dos要转成unix,直接转储使用-E提示编码就成功,这二者是同样的性质吗?
总结:
两个状况性质不一样,pg_dump没有生成文件,不存在dos和unix格式转换问题,可是因为表中有中文,会出现编码问题,若是只有数据和英文就不出现问题如上
“6.另外一场景”所说;
copy因为是在windows下生成文件,可能出现dos和unix格式转换问题,为了验证这个,我在linux服务器copy出来再ftp文件到windows下导入确实能够正常导入。
导数据出错若是没有找到明确的问题,把编码和数据格式转化也尝试尝试也许会有收获。