mysql5.7迁到tidbv5.0.1后报这个错

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
centos7

【概述】 场景 + 问题概述

【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

数据库没有异常sql日志

【问题】 当前遇到的问题

后台报这个错
org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column ‘dateStr’ from result set. Cause: java.sql.SQLException: Invalid length (10) for type TIMESTAMP
; Invalid length (10) for type TIMESTAMP; nested exception is java.sql.SQLException: Invalid length (10) for type TIMESTAMP

【业务影响】

【TiDB 版本】

v5.0.1

【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

在客户端直接执行语句报错么?

直接执行sql不报错,程序在mysql运行正常,切换到tidbv5.0.1后报错,是不是哪个地方没兼容?需要处理

SELECT
a.date AS dateStr,
SUM( c.RS ) AS userNum,
IFNULL( ROUND( SUM( c.RS * c.HSFBZ )/ SUM( c.RS ), 2 ), 0.0 ) AS stdMoneyAvg
FROM
(
SELECT
DATE_ADD( ‘2021-02-01’, INTERVAL ( key - 1 ) DAY ) AS date
FROM
temp_date_nums
WHERE
key <= ( DATEDIFF( ‘2021-02-28’, ‘2021-02-01’ )+ 1 )) a
LEFT JOIN (
SELECT
RYBZGL_TYWYSBM AS pid,
KS_RQ AS startDate,
JS_RQ AS endDate
FROM
hs_rybzgl
WHERE
SCBS = ‘0’
AND SFXG_PDBS = ‘1’
AND YWZT = ‘2’
AND JG_TYWYSBM = ‘8adee28450d6bd170150dfa89ffb1321’
) b ON ((
a.date >= b.startDate
AND a.date <= b.endDate ) OR ( b.endDate IS NULL AND a.date >= b.startDate
))
LEFT JOIN ( SELECT RYBZGL_TYWYSBM, RS, HSFBZ FROM hs_rybzglmx WHERE SCBS = ‘0’ ) c ON c.RYBZGL_TYWYSBM = b.pid
GROUP BY
a.date
ORDER BY
a.date;

表结构

hs_rybzgl.sql (4.1 KB)

<select id="listUserNumStdMoneyAvg" resultType="java.util.Map">
    SELECT a.`date`, COALESCE(SUM(c.RS),0) AS userNum, COALESCE(ROUND(SUM(c.RS*c.HSFBZ)/SUM(c.RS),2),0.0) AS stdMoneyAvg FROM
    (SELECT DATE_ADD(#{startDate},INTERVAL(`key`-1) DAY) AS `date` FROM temp_date_nums
        WHERE `key` <![CDATA[ <= ]]> (DATEDIFF(#{endDate},#{startDate})+1)) a
    LEFT JOIN
    (SELECT RYBZGL_TYWYSBM AS pid,KS_RQ AS startDate,JS_RQ AS endDate FROM hs_rybzgl
        WHERE SCBS = '0' AND SFXG_PDBS = '1' AND YWZT = '2' AND JG_TYWYSBM = #{orgId}
    ) b ON ((a.`date` <![CDATA[ >= ]]> b.startDate AND a.`date` <![CDATA[ <= ]]> b.endDate) OR (b.endDate IS NULL AND a.`date` <![CDATA[ >= ]]> b.startDate))
    LEFT JOIN
    (SELECT RYBZGL_TYWYSBM,RS,HSFBZ FROM hs_rybzglmx WHERE SCBS = '0') c ON c.RYBZGL_TYWYSBM = b.pid
    GROUP BY a.`date` ORDER BY a.`date`;
</select>

你的意思是通过客户端,在mysql和tidb中执行都不报错,但是通过程序调用,在mysql中正常,在tidb中报错?那需要程序端做一下兼容,或者数据库中检查一下a.date类型在mysql和tidb中的对比。

看报错信息应该是字段长度超过了程序里的接收长度

https://docs.pingcap.com/zh/tidb/stable/data-type-date-and-time

是的。

那就排查一下吧,看看 a. date在mysql和tidb中设置的类型,以及这个类型的对比,尤其返回值长度的比较。

找到解决办法了,
SELECT a.date 改成 SELECT cast(a.date as char) date,转成字符串就可以拿Map接了

2 个赞

:+1::+1::+1:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。