Python 插入 Mysql 日期字符串出错的问题

2020-10-19 12:54:10 +08:00
 zyftank
mysql 数据库中表 table_name 中 cl1 和 cl2 都是 varchar 字段。
插入数据的主要实现代码:
arg1='2012-01-15'
arg2 ='1'
sql = "insert into table_name(cl1,cl2) value(%s,%s)" %(arg1,arg2)
cur.execute(sql)

大体是上是这么实现的,也能插入数据,可是 arg1 这个数据插入后,不是‘2012-01-15'这个值,而是一个其他的年份,确实令人费解。

改成以下代码,就能正常插入。
sql = "insert into table_name(cl1,cl2) value(%s,%s)"
cur.execute(sql,[arg1,arg2])

请高手指点一下,这是什么情况?
1993 次点击
所在节点    Python
10 条回复
zyftank
2020-10-19 12:57:29 +08:00
还有种办法也能正常实现,就是改 sql 语句。

sql = "insert into table_name(cl1,cl2) value('"+arg1+"','"+arg2+"')"
iyaozhen
2020-10-19 13:12:44 +08:00
正常 sql 里面,插入字符串需要单引号 ''

cur.execute(sql,[arg1,arg2])
这样可以是因为做了参数绑定
zyftank
2020-10-19 13:31:14 +08:00
搞了半天,还是数据类型的问题,在写 sql 语句之前,已经进行了类型转换、调试打印,测试类型。就是没有打印 sql 语句,其实打印一下 sql 语句,问题就会明白了,其实还可以这样改。

sql ="insert table_name(cl1,cl2) value('%s','%s')" %(arg1,arg2)
est
2020-10-19 13:33:38 +08:00
大体是上是这么实现的,也能插入数据,可是 arg1 这个数据插入后,不是‘2012-01-15'这个值,而是一个其他的年份,确实令人费解。


这不费解啊。。values (2012-01-15, 1) 等于 values (1996, 1) 啊。

因为 2012-01-15 == 1996
raymanr
2020-10-19 13:35:32 +08:00
cur.execute(sql,[arg1,arg2])

多使用这种方法好点, 拼接 sql 会导致注入问题, 就算是自己使用, 也不能很好的处理带有 \ ' 等字符的数值
zhangysh1995
2020-10-19 13:40:13 +08:00
user8341
2020-10-19 16:23:09 +08:00
@est 哈哈,原来是一个算式
LGA1150
2020-10-19 16:34:47 +08:00
尽量使用参数化查询,不要手动拼接,如果 arg2 是 '1); DROP TABLE table_name; --' 就出大问题了🐶
hhyvs111
2020-10-20 10:13:23 +08:00
兄弟怕是大学生吧,这么容易 sql 注入的代码都写得出来
zyftank
2020-10-20 12:10:19 +08:00
@hhyvs111 就是个自己用的程序,又没提供网络功能,要防什么注入?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX