CSV含特殊字符加载到DB2表失败及字符转换异常问题求助
故障根因分析
- 字符集不匹配:你的系统LANG环境变量是en_US.UTF-8,但DB2 load命令默认不会自动识别CSV文件的编码,若目标表的字符列编码和文件编码不一致,特殊字符®会被判定为非法字符,一方面会导致分隔符|识别异常,原本的3个文本字段被识别为2个,第三个字段被置为null;另一方面非法编码存储到表中后,查询时触发字符转换异常。
- load参数配置问题:你当前使用的
fastparse参数会跳过部分字符格式校验,遇到非法编码字符不会在加载阶段报错,只会在后续查询时暴露问题;同时缺少明确的编码声明参数,导致DB2使用默认编码解析文件。
解决方案
步骤1:确认两端编码
- 先确认CSV文件的实际编码,执行Linux命令:
file -i filename
输出会直接显示文件的实际编码。 - 确认DB2目标表的编码,执行SQL查询:
SELECT codepage FROM syscat.tables WHERE tabname = UPPER('你的表名');
常见编码对应DB2 codepage值:UTF-8对应1208,GBK对应1386,GB2312对应1383。
步骤2:修改load命令添加编码参数
在MODIFIED BY后新增CODEPAGE参数指定文件的编码,同时可先移除fastparse参数做测试,加载阶段就能直接暴露编码问题,不用等到查询时才发现。若你没有用到字符包裹符,可移除无效的CHARDEL参数避免歧义。
修改后的load命令参考(文件为UTF-8场景):
load client from filename of del MODIFIED BY CODEPAGE=1208 timestampformat="YYYYMMDD" coldel| usedefaults messages logfilename insert into tablename nonrecoverable;
步骤3:可选文件转码方案
若不便修改load命令,可提前将CSV文件转码为和DB2表一致的编码,转码命令参考:iconv -f 原编码 -t 目标编码 原文件名 > 转码后文件名
步骤4:验证结果
加载完成后直接查询包含特殊字符的行,确认字段值完整无null,查询不会抛出CharConversionException异常即可。
内容的提问来源于stack exchange,提问作者sunanda p
相关产品推荐
相关产品推荐

