执行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
相关产品推荐
相关产品推荐

