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

如何阻止MySQL更新时将VARCHAR转换为年份?(Python+Flask-MySQLdb)

解决MySQL VARCHAR字段更新被转为年份格式的问题

我懂你的困扰——明明要把yyyy-mm-dd格式的字符串存到VARCHAR类型的字段里,结果更新后却变成了类似2000这样的年份数值,对吧?其实问题出在你拼接SQL语句的方式上,MySQL把你的日期字符串当成数学表达式计算了!

举个例子,当你传入start为2018-05-13,用%直接格式化SQL后,生成的语句会是:

UPDATE SchedulePlaylist SET start = 2018-05-13 ,end = ... WHERE ...

MySQL会把2018-05-13理解成减法运算(2018减5减13),结果就是2000,自然就存成了数值类型的年份格式。

正确方案:使用参数化查询(推荐)

Flask-MySQLdb支持参数化查询,这不仅能彻底解决类型转换问题,还能防止SQL注入,是最安全的做法。你不需要手动处理字符串格式,直接把参数传给execute()方法即可:

query = "UPDATE SchedulePlaylist SET start = %s, end = %s WHERE playlist_id = %s AND schedule_id = %s"
cursor.execute(query, (start, end, playlist_id, schedule_id))
# 记得提交事务
conn.commit()  # 或者根据你的连接方式用 db.session.commit()

这里的%s是MySQLdb的参数占位符,execute()会自动给字符串参数加上引号,确保MySQL把它当成VARCHAR类型的字符串处理,不会触发数值计算。

如果你非要用字符串格式化(不推荐)

要是你坚持手动拼接SQL,那必须给日期字符串加上单引号,明确告诉MySQL这是字符串常量:

query = "UPDATE SchedulePlaylist SET start = '%s' ,end = '%s' WHERE playlist_id = %s AND schedule_id = %s" % (str(start), str(end), playlist_id, schedule_id)

注意这里的'%s'是带单引号的占位符,拼接后SQL里的日期会变成'2018-05-13',MySQL就会把它当成字符串存储了。但这种方式存在SQL注入风险,不建议使用。

额外小提醒

确保你的start和end变量本身就是yyyy-mm-dd格式的字符串,如果它们是日期对象,记得先用start.strftime('%Y-%m-%d')这类方法转成正确格式的字符串,再传入参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:22:54