GaussDB(DWS)通过GDS导出的文件竟然无法重新导入到源表?原来是分隔符与字符集不兼容搞的鬼

举报
SeqList 发表于 2020/10/17 23:55:36 2020/10/17
【摘要】 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';


那么一般情况下,我们使用导出的文件,通过外表查询是能够查询的。但在上述情况下,查询外表是会报错的:

image.png


问题分析:

报错看起来像是不认识分隔符,于是看看导出的文件的字符集,发现字符集是latin1的。我明明设置的是UTF8,为啥是latin1的呢?

经分析发现分隔符的E'\xa7',UTF-8是不兼容的,UTF-8无法读取这个分隔符,估计是这个原因,使得即使导出外表指定了UTF-8,导出的字符集变成了latin1,而latin1能够读取该分隔符。



问题解决:

既然UTF8无法读取E'\xa7'这个分隔符,那解决的方法就两个了

  1. 修改外表分隔符为UTF-8能识别的。查阅资料发现UTF-8无法读取128-256之间的字符,像E'\x07' 这个,UTF-8能够正常识别

  2. 修改字符集为latin1,这样也能解决问题。因为这个问题提出的客户是不使用中文的,且E\xa7'在客户中使用较多,于是采取使用latin1的修改方法。


外表使用latin1字符集以后,能够正常导出导入了

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。