You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助调试:ResultSet映射Java POJO时出现TIMESTAMP转换异常

问题定位与调试方案

看起来你遇到的是ResultSet字段读取错位引发的TIMESTAMP转换失败问题,我帮你拆解下核心原因和具体调试步骤:

核心原因分析

从异常栈的Caused by部分能看到关键线索:

java.lang.NumberFormatException: 0000_15975991715696�8SMPPMTTX2020-08-16 17:33:21.647 TRAFFIC-SPLIT2020-08-16 19:13:21.690Venu-Traffic-Split-On-net2020-08-16 17:52:41.877311110 HANDSET_ACK2020-08-16 17:33:21.6902020-08-16 17:33:21.6902020-08-16 17:52:40.000lid:1915976003605490 sub:001 dlvrd:001 submit date:2008161752 done date:2008161752 stat:DELIVRD err:000 text:3310

这个报错字符串明显是多个字段内容的拼接(包含短信状态、业务标识、多个时间串),说明JDBC读取ResultSet时字段边界错位了——不是第18列真的是这个乱码内容,而是前面的某个变长字段(比如VARCHAR/TEXT)实际存储长度超出了数据库定义的长度,导致后续字段的读取位置偏移,把其他字段的内容挤到了第18列的位置,最终触发TIMESTAMP转换失败。

具体调试步骤

  • 核对查询字段与表结构的一致性
    检查你的SQL查询语句中第18列对应的字段,在数据库表中是否确实是TIMESTAMP/DATETIME类型?同时确认查询的字段顺序和表结构的字段顺序是否匹配,有没有因为新增/删除字段、使用别名导致顺序错位的情况。
  • 排查变长字段的溢出问题
    单独查询出现问题的那行数据,重点检查第18列之前的字段(比如第17列)是否存在超长内容(比如短信文本、业务描述等)。如果某个字段的实际存储长度超过了表定义的长度,MySQL返回ResultSet时会打破字段边界,导致后续字段内容混乱。
  • 升级JDBC驱动并优化连接参数
    你当前使用的是旧版的com.mysql.jdbc驱动(5.x系列),建议升级到最新的MySQL Connector/J 8.x版本(驱动类改为com.mysql.cj.jdbc.Driver),同时在JDBC连接URL中添加以下参数避免编码和时区问题:
    jdbc:mysql://your-host:port/your-db?useUnicode=true&characterEncoding=utf8mb4&useTimezone=true&serverTimezone=UTC
    
  • 单独测试字段转换逻辑
    写一个极简的测试代码,只查询有问题的那行数据的第18列,分别调用getString()和getTimestamp()方法,确认返回的内容是否正常,进一步验证是不是字段错位导致的问题。

临时应急方案

如果暂时没法调整表结构或升级驱动,可以尝试在SQL查询中显式转换字段类型,避开JDBC自动转换逻辑:

SELECT 
  -- 其他字段...
  CAST(your_timestamp_column AS CHAR) AS your_timestamp_column
  -- 其他字段...
FROM your_table

然后在Java代码中手动将字符串转换为Timestamp对象,比如:

String timeStr = resultSet.getString("your_timestamp_column");
Timestamp ts = Timestamp.valueOf(timeStr);

内容的提问来源于stack exchange,提问作者Manikanta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:57:32