Python中往MySQL存入时间"2018-05-16 23:28:13"报错ProgrammingError: (1064, ...)是什么格式问题?

MySQL 数据格式设为 varchar 和 datetime 都存不进去:

login_time = "2018-05-16 23:28:13"
cursor.execute("insert into user_logs (user_id, login_time)  values (%s, %s)" % \
                       (int(user_id), login_time))

出错提示( MySQL5.5):

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '23:28:13)'  at line 1")

Python中往MySQL存入时间"2018-05-16 23:28:13"报错ProgrammingError: (1064, ...)是什么格式问题?

8 回复

引号问题吧,第二个 %s 用引号包起来


这个报错是SQL语法问题,通常是因为时间字符串格式不对或者没加引号。

看看你的代码是不是这样写的:

# 错误示例 - 直接拼接字符串
sql = f"INSERT INTO table (time_field) VALUES ({time_str})"
cursor.execute(sql)

应该用参数化查询:

import pymysql
from datetime import datetime

# 正确的写法
conn = pymysql.connect(host='localhost', user='root', password='', database='test')
cursor = conn.cursor()

time_str = "2018-05-16 23:28:13"

# 方法1:直接传字符串(MySQL会自动转换)
sql = "INSERT INTO your_table (time_column) VALUES (%s)"
cursor.execute(sql, (time_str,))

# 方法2:转换成datetime对象
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
cursor.execute(sql, (dt,))

conn.commit()

关键点:

  1. 必须用参数化查询%s占位符),不要直接拼接SQL字符串
  2. 时间字段在SQL中要用单引号包裹,参数化查询会自动处理
  3. 确保MySQL表中的时间字段类型是DATETIMETIMESTAMP

如果你直接拼接SQL,生成的语句会是:

-- 错误:缺少引号
INSERT INTO table (time_field) VALUES (2018-05-16 23:28:13)

-- 正确:有引号
INSERT INTO table (time_field) VALUES ('2018-05-16 23:28:13')

改成参数化查询就能解决。

总结:用参数化查询替代字符串拼接。

login_time = "2018-05-16 23:28:13"
cursor.execute(“insert into user_logs (user_id, login_time) values (%s, ‘%s’)” % <br> (int(user_id), login_time))

<br>cursor.execute("insert into user_logs (user_id, login_time) values (%s, %s)", (int(user_id), login_time))<br>
这样应该可以了吧。
不要自己通过字符串格式化的方式填充参数生成 SQL,这样除了容易拼错引号之类的导致语法错误外还很容易引入 SQL 注入漏洞。

楼主最好不要这么写,很容易被 SQL 注入,应该用参数化方式, 那个 int ()转换也是多余的。
直接写成下面这样就可以了。

cursor.execute(“insert into user_logs (user_id, login_time) values (%s, %s)”, (user_id, login_time))

你可以把 sql 语句打出来看看,vules 没有引号的话貌似会报语法错误。昨天刚碰到这个问题。最后加了个转义符搞定。

sql = “insert into trade_info(trade_no,trade_time,info,income,balance,source) values (’{trade_no}’,’{trade_time}’,’{info}’,’{income}’,’{balance}’,’{source}’)”.format(trade_no=trade_no,trade_time=str(trade_time), info=str(info), income=str(income), balance=str(balance),source=str(source))






我应该是某个地方格式写错了,谢谢楼上同学,用字符串加’'和传参的方式都可以。

回到顶部