V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zyftank
V2EX  ›  Python

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

  •  
  •   zyftank · 2020-10-19 12:54:10 +08:00 · 2014 次点击
    这是一个创建于 1500 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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])

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

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

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

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


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

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

    多使用这种方法好点, 拼接 sql 会导致注入问题, 就算是自己使用, 也不能很好的处理带有 \ ' 等字符的数值
    zhangysh1995
        6
    zhangysh1995  
       2020-10-19 13:40:13 +08:00
    user8341
        7
    user8341  
       2020-10-19 16:23:09 +08:00
    @est 哈哈,原来是一个算式
    LGA1150
        8
    LGA1150  
       2020-10-19 16:34:47 +08:00
    尽量使用参数化查询,不要手动拼接,如果 arg2 是 '1); DROP TABLE table_name; --' 就出大问题了🐶
    hhyvs111
        9
    hhyvs111  
       2020-10-20 10:13:23 +08:00
    兄弟怕是大学生吧,这么容易 sql 注入的代码都写得出来
    zyftank
        10
    zyftank  
    OP
       2020-10-20 12:10:19 +08:00
    @hhyvs111 就是个自己用的程序,又没提供网络功能,要防什么注入?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3508 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 04:49 · PVG 12:49 · LAX 20:49 · JFK 23:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.