今天在日常工作中遇到了一个问题,正常的 insert into操作报错了
### Cause: dm.jdbc.driver.DMException: 字符串截断
; 字符串截断; nested exception is dm.jdbc.driver.DMException: 字符串截断
报错日志的详细信息如图
根据以往经验应该是字段长度不够,才会触发这样的报错,于是排查了数据库中表的字段长度
再对比控制台打印的insert into 插入语句的参数长度,理论上没有看出哪个字段超出最大长度,于是将控制台中的sql拼写后放入【DM管理工具】进行尝试
INSERT INTO edu_course_api_log ( title, business_type, method, request_method, operator_type, oper_url, oper_ip, oper_param, json_result, status, oper_time, exec_time ) values ( '培训申请第一次或第二次提交审核接口', 8, 'com.dongao.modules.api.controller.TrainApiController.submitExamine()', 'get', 3, '/hbJxjyUser/api/train/submitExamine', '172.16.210.39', '{"sign":["28971d8a3203c3a786b6ce5e8cc5b397"],"applyId":["5"],"type":["1"]}', '{"code":200,"data":{},"success":true,"message":"操作完成."}', 1, now(), 18702 );
可以很直观的看到具体有问题的字段
查阅待插入字段的内容长度
汉字长度 17,而数据库"TITLE" VARCHAR(50),从通常的理解应该是可以放下的,那么查阅达梦数据库文档得知
MySQL 中 varchar(1) 可以存一个汉字,DM 数据库是以字节为单位。gb18030 字符集,varchar(2) 才可以存一个汉字;UTF-8 字符集,varchar(3) 才可以存一个汉字。此种情况下,为了保证汉字可以完整的被存储,扩大字段是合理的。
到这里也就理解了,title字段最大varchar(50) ,而数据库是UTF-8 字符集,17个汉字占用存储空间就是17*3=51>50,因而导致报错 nested exception is dm.jdbc.driver.DMException: 字符串截断
找到了原因,那么解决方案就明晰了,可以更改字段长度或者在插入时控制title 汉字内容长度不能超过 16个汉字即可。