使用Python ibm_db加载CSV到DB2时TRIMBLANKS参数报错
DB2外部表加载CSV时TRIMBLANKS参数报错的问题解决
问题背景
使用Python ibm_db 3.2.6库执行外部表插入SQL,将CSV数据加载至DWHD1.USERS表,SQL语句如下:
INSERT INTO DWHD1.USERS SELECT * FROM external 'USERS.csv' USING ( CCSID 923 DELIMITER '~' MAXERRORS 1 CTRLCHARS 'ON' FILLRECORD 'TRUE' REMOTESOURCE 'JDBC' TIMESTAMP_FORMAT 'YYYY-MM-DD HH24:MI:SS' ESCAPECHAR '\\' NULLVALUE '' LOGDIR '/tmp' SKIPROWS 1 TRIMBLANKS 'BOTH' )
执行时报错:
ibm_db_dbi.ProgrammingError: ibm_db_dbi::ProgrammingError: Statement Execute Failed: [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N An unexpected token "TRIMBLANKS" was found following "SKIPROWS 1". Expected tokens may include: "TRIM_NULLS". SQLSTATE=42601 SQLCODE=-104
当前环境为icr.io/db2_community/db2 Docker镜像,db2level输出为DB2 v12.1.1.0,用户查阅DB2 11.5官方文档后认为TRIMBLANKS是有效参数,但报错仍存在。
报错原因
TRIMBLANKS是DB2外部表的新增参数,仅在DB2 11.5.4及以上版本、DB2 12.1.0.5及以上版本中才被支持。当前使用的DB2 v12.1.1.0属于12.1的早期版本,并不包含该参数,因此数据库识别到TRIMBLANKS时会抛出语法错误,同时提示旧版本支持的替代参数TRIM_NULLS。
解决方法
方案1:升级DB2版本
将DB2升级到支持TRIMBLANKS参数的版本:
- 若使用11.5系列,升级至11.5.4.0或更高版本
- 若使用12.1系列,升级至12.1.0.5或更高版本
Docker环境下可直接更换对应版本的镜像,例如:
docker pull icr.io/db2_community/db2:11.5.4.0
方案2:替换参数并手动处理空白(无需升级)
如果暂时无法升级,可做以下调整:
- 将SQL中的
TRIMBLANKS 'BOTH'替换为旧版本支持的TRIM_NULLS 'BOTH',注意两者行为差异:- TRIM_NULLS:仅当字段值全部为空白字符时,将其转换为NULL
- TRIMBLANKS:去除字段值的前导/尾随空白字符
- 若需要实现去除字段空白的效果,在SELECT语句中手动使用TRIM函数,示例:
INSERT INTO DWHD1.USERS SELECT TRIM(col1), TRIM(col2), TRIM(col3), ... -- 按表字段顺序逐一添加TRIM FROM external 'USERS.csv' USING ( CCSID 923 DELIMITER '~' MAXERRORS 1 CTRLCHARS 'ON' FILLRECORD 'TRUE' REMOTESOURCE 'JDBC' TIMESTAMP_FORMAT 'YYYY-MM-DD HH24:MI:SS' ESCAPECHAR '\\' NULLVALUE '' LOGDIR '/tmp' SKIPROWS 1 TRIM_NULLS 'BOTH' )
内容的提问来源于stack exchange,提问作者Ryuuk
相关产品推荐
相关产品推荐

