paulxie
作者paulxie·2012-06-16 11:37
数据库管理员·CMBC

db2 使用 | 做分割符的问题 (转)

字数 1177阅读 3323评论 0赞 1

今天遇到以个数据库import的问题,要导入数据库的文件是一个由其他系统生成的GBK文件,另外字段的分割符为“|”,而目标库是UTF-8编码。所以执行import的时候指定了codepage=1386,但是遇到SQL3017N的错误,查询到原因方法见下方。

解决方法:更改生成导入文件的系统设置,将导出的GBK文件使用“,”分隔,问题解决。


问题原因描述:

我们ETL开发人员在做数据装载时,发现如果使用“|”作为分隔符,无论是export还是load,DB2都会报

 

SQL3017N的错误。

 

SQL3017N  A delimiter is not valid or is used more than once.

 

SQL3017N错误的产生,原因如下(摘自官方文档):

 

对于“定界”ASCII (DEL) 文件,发生以下两种错误之一:

 

对列定界符、字符串定界符或小数点字符指定的字符无效。

对于 SBCS 或 UTF-8 数据,定界符的有效范围是 0×00 – 0x7F(包括 0×00 和 0x7F 在内)。

对于 MBCS 数据,定界符的有效范围是 0×00 – 0x3F(包括 0×00 和 0x3F 在内)。

对于 EBCDIC MBCS 数据,定界符的有效范围是 0×00 – 0x3F(包括 0×00 和 0x3F 在内),但是,有一种

 

例外情况就是,定界符不能为 SHIFT-OUT(0x0E)或者 SHIFT-IN(0x0F)字符。

为多个前述项目指定了同一个字符。

经过查询,我们数据库的字符集是1386,属于MBCS数据,因此定界符最大是0x3F,而“|”的ASCII码为0x7C,

 

超过了有效范围。解决办法,是做Export或者Load操作时,增加codepage选项,让DB2自动进行字符集转换:

 

EXPORT TO "/data/temp/card.dat" OF DEL

MODIFIED BY codepage=1208 COLDEL|

MESSAGES "/data/temp/card.log"

SELECT * FROM BI.STG_CDR_OBS_CARD

 

LOAD CLIENT FROM "/data/temp/card.dat" OF DEL

MODIFIED BY CODEPAGE=1208 COLDEL|

MESSAGES "/data/temp/card.log"

INSERT INTO BI.STG_CDR_OBS_CARD

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广