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

将查询得到的身高厘米值插入新列时遇数据截断错误求助

解决身高英尺英寸转厘米UPDATE时的数据截断错误

问题描述

active_players_2表中身高列格式为6' 7",使用SELECT语句可正确计算对应的厘米值,但新增Height_cm列后执行UPDATE语句时,出现[22001][1292]数据截断错误,提示信息为:Truncated incorrect INTEGER value: ' 5"'。

原SELECT语句:

SELECT
    Name,
    (CAST(SUBSTR(Height,1, LOCATE("'",Height)-1) AS UNSIGNED) * 30.48) +
    (CAST(SUBSTR(Height, LOCATE("'",Height)+1) AS UNSIGNED) * 2.54 )   AS cm
FROM
    active_players_2;

原ALTER和UPDATE语句:

ALTER TABLE active_players_2
   ADD Height_cm DECIMAL(10,2) NULL;
UPDATE active_players_2 
SET active_players_2.Height_cm= (CAST(SUBSTR(Height,1, LOCATE("'",Height)-1) AS UNSIGNED) * 30.48) +
            (CAST(SUBSTR(Height, LOCATE("'",Height)+1) AS UNSIGNED) * 2.54 )

错误原因

错误提示中的' 5"'表明,截取的英寸部分包含空格和双引号这类非数字字符,直接将其转为UNSIGNED整数时,因无法识别非数字内容触发数据截断。SELECT语句可能仅扫描了部分无异常的数据,而UPDATE是全表执行,因此暴露了数据格式的问题。

解决方案

修改UPDATE语句中的计算逻辑,确保提取到纯数字的英尺和英寸值:

方案1:使用TRIM清理非数字字符

通过TRIM(BOTH '" ' FROM ...)移除英寸部分的空格和双引号:

UPDATE active_players_2 
SET Height_cm= (CAST(SUBSTR(Height,1, LOCATE("'",Height)-1) AS UNSIGNED) * 30.48) +
               (CAST(TRIM(BOTH '" ' FROM SUBSTR(Height, LOCATE("'",Height)+1)) AS UNSIGNED) * 2.54 )

方案2:使用正则表达式提取数字

用REGEXP_SUBSTR直接从身高字符串中提取第一组和第二组数字,分别对应英尺和英寸:

UPDATE active_players_2 
SET Height_cm= (CAST(REGEXP_SUBSTR(Height, '[0-9]+', 1, 1) AS UNSIGNED) * 30.48) +
               (CAST(REGEXP_SUBSTR(Height, '[0-9]+', 1, 2) AS UNSIGNED) * 2.54 )

验证

执行修改后的UPDATE语句前,可先用SELECT语句验证计算逻辑是否正确:

SELECT
    Name,
    Height,
    (CAST(REGEXP_SUBSTR(Height, '[0-9]+', 1, 1) AS UNSIGNED) * 30.48) +
    (CAST(REGEXP_SUBSTR(Height, '[0-9]+', 1, 2) AS UNSIGNED) * 2.54 ) AS cm
FROM active_players_2;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:40:25