推荐学习书目
› 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 · Oct 19, 2020 · 3128 views
    This topic created in 2207 days ago, the information mentioned may be changed or developed.
    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 replies  •  2020-10-20 12:10:19 +08:00
    zyftank
    zyftank
    OP
    Oct 19, 2020
    1
    还有种办法也能正常实现,就是改 sql 语句。

    sql = "insert into table_name(cl1,cl2) value('"+arg1+"','"+arg2+"')"
    iyaozhen
    iyaozhen
    Oct 19, 2020
    2
    正常 sql 里面,插入字符串需要单引号 ''

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

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


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

    因为 2012-01-15 == 1996
    raymanr
    raymanr
    Oct 19, 2020❤️1
    5
    cur.execute(sql,[arg1,arg2])

    多使用这种方法好点, 拼接 sql 会导致注入问题, 就算是自己使用, 也不能很好的处理带有 \ ' 等字符的数值
    9LCRwvU14033RHJo
    9LCRwvU14033RHJo
    Oct 19, 2020
    7
    @est 哈哈,原来是一个算式
    LGA1150
    LGA1150
    Oct 19, 2020
    8
    尽量使用参数化查询,不要手动拼接,如果 arg2 是 '1); DROP TABLE table_name; --' 就出大问题了🐶
    hhyvs111
    hhyvs111
    Oct 20, 2020
    9
    兄弟怕是大学生吧,这么容易 sql 注入的代码都写得出来
    zyftank
    zyftank
    OP
    Oct 20, 2020
    10
    @hhyvs111 就是个自己用的程序,又没提供网络功能,要防什么注入?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1493 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 22:38 · PVG 06:38 · LAX 14:38 · JFK 17:38
    ♥ Do have faith in what you're doing.