You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中MySQLdb转义字符串带b前缀致SQL语法错误如何规范解决?

问题根因

MySQLdb.escape_string() 在Python3环境下的返回值为bytes字节类型,而非str字符串类型。你直接将bytes对象传入字符串格式化方法时,Python会自动调用bytes对象的__repr__方法输出带b'前缀、'后缀的表示形式,拼接入SQL语句后就会触发语法错误。
同时你的原有代码还存在一个隐含问题:title是字符串类型字段,你拼接SQL时没有在外层包裹单引号,即使去掉b前缀也会有语法问题。

规范解决方案
  • 优先使用参数化查询(最高推荐)
    完全不需要手动调用转义方法,由数据库驱动自动处理转义、编码、类型匹配,从根源避免SQL注入风险,是行业通用的最佳实践:

    import MySQLdb
    import csv
    
    def TSV_to_SQL(file_to_open):
        # 建立连接指定编码
        db = MySQLdb.connect(
            host='localhost', 
            user='root', 
            passwd='', 
            db='tutorialdb', 
            charset='utf8'
        )
        cursor = db.cursor()
        # 预定义SQL模板,用%s作为参数占位符
        insert_sql = "INSERT INTO movies (imdb_id, title, release_year) VALUES (%s, %s, %s)"
        with open(file_to_open, encoding="utf8") as file:
            tsv = csv.reader(file, delimiter="\t")
            count = 0
            for line in tsv:
                if count == 10:
                    break
                # 直接传入参数元组给execute方法,自动处理转义
                cursor.execute(insert_sql, (line[0], line[1], line[2]))
                count += 1
        # 提交事务
        db.commit()
        cursor.close()
        db.close()
    
  • 若必须手动拼接SQL的处理方案
    把escape_string返回的bytes对象解码为utf-8字符串,同时手动给字符串类型字段包裹单引号:

    # 转义后解码为字符串
    escaped_title = MySQLdb.escape_string(line[1]).decode('utf-8')
    statement = "INSERT INTO movies (imdb_id, title, release_year) VALUES ('{imdb_id}','{title}',{year})\n".format(
        imdb_id=line[0], 
        title=escaped_title, 
        year=line[2]
    )
    

    注意该方案仍存在漏处理边界情况触发SQL注入的风险,非必要不推荐使用。

内容的提问来源于stack exchange,提问作者Auti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:00:00