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
omg21
V2EX  ›  Python

怎样才能把单引号双引号这些特殊字符存到数据库里?

  •  
  •   omg21 · 2016-07-08 23:24:42 +08:00 · 9031 次点击
    这是一个创建于 3063 天前的主题,其中的信息可能已经有所发展或是发生改变。
    aa='''
    <td valign="top" align='left'><p class="p"><span style="font-family: 微软雅黑; font-size: 12pt;">根据工作需要,经学校人社处批准,电子科学与工程学院公开招聘实验技术人员</span><font face="Times New Roman" style="font-size: 12pt;">2</font><font face="微软雅黑" style="font-family: 微软雅黑; font-size: 12pt;">人。有关事宜公布如下:</font></p><p class="p"><span style="mso-spacerun:'yes';font-family:微软雅黑;mso-ascii-font-family:'Times New Roman';mso-hansi-font-family:'Times New Roman';mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;mso-font-kerning:0.0000pt;">一、招聘条件</span><span style="mso-spacerun:'yes';...</td>
    '''

    dbstr = "insert into zwlist(a1) values('%s')"%(aa)
    db.execute(dbstr)
    db.commit()
    在保存网页内容到数据库里时,出现这个错误:

    pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] 语法错误 (操作符丢失) 在查询表达式 \'\'<td valign="top" align=\'left\'><p class="p"><span style="font-family: 微软雅黑; font-size: 12pt;">根据工作需要,经学校人社处批准,电子科学与工程学院公开招聘实验技术人员</span>\'\'

    这是因为网页里有单引号双引号,还有一些其他 字符 ,执行到 db.execute(dbstr)这条时就出现了错误,怎样才能把这些特殊字符存到数据库里?
    20 条回复    2016-07-10 13:56:17 +08:00
    raptium
        1
    raptium  
       2016-07-08 23:27:52 +08:00
    都 2016 年了,你还在用字符串拼接 SQL ……
    raptium
        2
    raptium  
       2016-07-08 23:29:09 +08:00
    dbstr = "insert into zwlist(a1) values('%s')"
    db.execute(dbstr, [aa])
    murmur
        3
    murmur  
       2016-07-08 23:30:36 +08:00
    如果是 php 的话用 addslashes 就可以了 其他语言直接自己实现一个 addslashes 就可以了
    有的时候还真得拼接一下 比如说 like 而且像 oracle 他对%和_都敏感。。那就不安逸了
    cxbig
        4
    cxbig  
       2016-07-08 23:45:45 +08:00
    ORM 在哪?
    quadpixels
        5
    quadpixels  
       2016-07-09 01:45:35 +08:00
    我就记得单引号在转义中是写成连续两个单引号(`''`)…
    omg21
        6
    omg21  
    OP
       2016-07-09 06:27:58 +08:00
    @raptium
    dbstr = "insert into zwlist(a1) values('%s')"
    db.execute(dbstr, [aa])
    这样写报错:
    pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 0 parameter markers, but 1 parameters were supplied')
    omg21
        7
    omg21  
    OP
       2016-07-09 06:29:25 +08:00
    @murmur
    我记得以前用 VB 是用 ' " & & " '
    aprikyblue
        8
    aprikyblue  
       2016-07-09 06:46:43 +08:00 via Android
    为什么不查查文档呢。。
    argsno
        9
    argsno  
       2016-07-09 07:23:36 +08:00 via Android
    dbstr = "insert into zwlist(a1) values(%s)"
    db.execute(dbstr, (a,)])
    laoyur
        10
    laoyur  
       2016-07-09 08:03:24 +08:00
    目测一大波 sql 注入党正对楼主的服务器虎视眈眈中
    magicdawn
        11
    magicdawn  
       2016-07-09 08:22:15 +08:00
    Node.js 的话, 有 driver, 例如 require('mysql').escape(val) 就可以了...
    不知道 python 有没...
    klesh
        12
    klesh  
       2016-07-09 10:09:42 +08:00
    @magicdawn 我觉得正确的使用方式是这样的:
    connection.query('INSERT INTO table VALUES (?, ?)', [a, b], cb)
    kaneg
        13
    kaneg  
       2016-07-09 10:54:15 +08:00
    直接上 base64 ,不过什么符号照单全收
    iyaozhen
        14
    iyaozhen  
       2016-07-09 12:19:01 +08:00 via Android
    搞过和楼主类似的需求。
    1 解析 HTML 然后格式化存储
    2 base64 存进去,不过长度会增加大概 1/3
    3 转义特殊字符,每个语言都有标准方法吧
    freestyleyoo
        15
    freestyleyoo  
       2016-07-09 12:21:38 +08:00 via Android
    新手不懂 2 楼所说呀,能否教教我那个语法是什么意思呢,老师只教过我 ps.setint(1,a)这样的啊, oracle 的数据库,很多时候都要用到字符串萍姐啊,真心求教,我是不是太新手了
    bdbai
        16
    bdbai  
       2016-07-09 13:16:23 +08:00 via Android
    @freestyleyoo 搜索引擎和文档是你最好的老师。
    magicdawn
        17
    magicdawn  
       2016-07-09 15:00:19 +08:00
    @klesh

    Node.js 中的 mysql.escape 以及 mysql.format, escape 输入单个值, format 调用 escape. 然后 query 调用 format
    就是你说的这样...
    freestyleyoo
        18
    freestyleyoo  
       2016-07-09 17:15:19 +08:00 via Android
    @bdbai 好的,谢谢你
    omg21
        19
    omg21  
    OP
       2016-07-09 20:35:44 +08:00
    @iyaozhen 可是 base64 编码后的字符串会有 b'开头,这个也没法代换到 SQL 的 values('%s')里啊
    chuxiwen
        20
    chuxiwen  
       2016-07-10 13:56:17 +08:00 via iPad
    Prepared Statements 啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3204 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:38 · PVG 08:38 · LAX 16:38 · JFK 19:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.