GaussDB(DWS)通过GDS导出的文件竟然无法重新导入到源表?原来是分隔符与字符集不兼容搞的鬼
【摘要】 GaussDB(DWS)通过GDS导出的文件,用GDS重新导入到源表,竟然会报错。带着疑问研究了下为什么会这样,原来是字符集不兼容分隔符导致的,分隔符无法被外表的字符集正确读取
最近遇到一个问题,说GaussDB(DWS)通过GDS导出的文件,用GDS重新导入到源表,竟然会报错。带着疑问研究了下为什么会这样,原来是字符集不兼容分隔符导致的。具体是怎样的呢,下面来分析一下
问题回顾:
首先,各种的字符集如下
SERVER_ENCODING=SQL_ASCII
CLIENT_ENCODING=UTF8
导出外表建表语句,其中分隔符指定的是E'\xa7'
create foreign table nation_out (like nation) server gsmpp_server options (location 'gsfs://10.185.180.119:5000/nation.out', format 'text' , delimiter E'\xa7', encoding 'utf-8') write only;
导入外表建表语句:
create foreign table nation_load (like nation) server gsmpp_server options (location 'gsfs://10.185.180.119:5000/nation.out/nation_out.dat.0' , format 'text' ,mode 'Normal' ,encoding 'UTF8',delimiter E'\xa7' ,compatible_illegal_chars 'on') LOG INTO err_nation_load1 PER NODE REJECT LIMIT 'unlimited';
那么一般情况下,我们使用导出的文件,通过外表查询是能够查询的。但在上述情况下,查询外表是会报错的:
问题分析:
报错看起来像是不认识分隔符,于是看看导出的文件的字符集,发现字符集是latin1的。我明明设置的是UTF8,为啥是latin1的呢?
经分析发现分隔符的E'\xa7',UTF-8是不兼容的,UTF-8无法读取这个分隔符,估计是这个原因,使得即使导出外表指定了UTF-8,导出的字符集变成了latin1,而latin1能够读取该分隔符。
问题解决:
既然UTF8无法读取E'\xa7'这个分隔符,那解决的方法就两个了
修改外表分隔符为UTF-8能识别的。查阅资料发现UTF-8无法读取128-256之间的字符,像E'\x07' 这个,UTF-8能够正常识别
修改字符集为latin1,这样也能解决问题。因为这个问题提出的客户是不使用中文的,且E\xa7'在客户中使用较多,于是采取使用latin1的修改方法。
外表使用latin1字符集以后,能够正常导出导入了
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)