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

执行SQL更新语句时出现last_trade_time列数据截断数据库错误

Fixing "Data truncated for column 'last_trade_time' at row 1" Error in MySQL UPDATE

这个错误本质上是你传入的last_trade_time值和MySQL表中该字段的类型/范围不匹配,导致数据库无法完整存储这个值,只能触发截断处理。下面是一步步的排查和解决方法:

1. 先确认表字段的类型和范围

首先要搞清楚orders表中last_trade_time字段的具体类型,不同类型的合法范围差异很大:

  • 执行这条SQL查看表结构:
    DESCRIBE orders;
    
    • 如果是TIMESTAMP类型:合法范围是'1970-01-01 00:00:01'到'2038-01-19 03:14:07',超出这个区间的时间值会直接触发截断错误。
    • 如果是DATETIME类型:范围宽很多,是'1000-01-01 00:00:00'到'9999-12-31 23:59:59',但如果你的ltt是这个区间外的极端值(比如公元999年)也会出问题。

2. 检查Python中ltt的合法性

  • 先打印ltt的值,快速确认它是否在数据库字段的合法范围内:
    print(ltt)
    print(ltt.year) # 直接看年份是否符合对应类型的要求
    
  • 如果ltt是带时区的datetime对象(即ltt.tzinfo不为None),MySQL的DATETIME/TIMESTAMP不存储时区信息,直接传入可能会导致格式解析错误,需要先转换为无时区的naive datetime:
    # 转换为UTC时间后移除时区信息
    ltt_naive = ltt.astimezone(datetime.timezone.utc).replace(tzinfo=None)
    

3. 显式格式化时间为MySQL兼容的字符串

虽然Python的数据库驱动(比如pymysql、MySQLdb)通常会自动转换datetime对象,但有时候自动转换会出问题,手动格式化更稳妥。把ltt转换成MySQL标准的YYYY-MM-DD HH:MM:SS格式字符串:

from datetime import datetime

# 假设ltt是你的datetime变量
ltt_formatted = ltt.strftime('%Y-%m-%d %H:%M:%S')

4. 修改后的完整代码示例

from datetime import datetime

# 你的原始datetime值
ltt = datetime.now()

# 处理时区(如果有时区的话)
if ltt.tzinfo is not None:
    ltt = ltt.astimezone(datetime.timezone.utc).replace(tzinfo=None)

# 格式化时间字符串
ltt_formatted = ltt.strftime('%Y-%m-%d %H:%M:%S')

query1 = 'UPDATE orders SET last_trade_time = %s WHERE tradingsymbol LIKE %s'
query2 = 'SET SQL_SAFE_UPDATES = 0;'
xx = 'TATACHEM'

pointer.execute(query2)
# 使用格式化后的时间字符串执行更新
pointer.execute(query1, (ltt_formatted, xx,))
db.commit()

额外排查点

  • 如果以上方法都没用,检查字段是否设置了更严格的约束(比如NOT NULL但你传入了空值?不过你的错误是截断,大概率不是这个情况)。
  • 确保你的数据库驱动是最新版本,旧版本可能存在datetime类型转换的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:40:27