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

Python PyODBC插入SQL Server时特殊字符乱码问题求助

解决SQL Server插入特殊字符乱码问题

核心问题:字符串拼接SQL引发编码异常

你当前直接将值拼接成SQL语句的写法,会导致pyodbc无法正确处理Unicode字符的编码转换——即便打印出的SQL语句显示正常,实际执行时编码仍会出现错乱,同时这种写法还存在SQL注入风险。

解决方案步骤

1. 用参数化查询替代字符串拼接

修改insert函数,采用参数化方式传递值,这是pyodbc处理Unicode字符的标准方案:

def insert(self, table_name: str, column_values: dict):
    columns = ', '.join(column_values.keys())
    # 用占位符?代替直接拼接值
    placeholders = ', '.join(['?' for _ in column_values.values()])
    query = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})"
    print(query)

    try:
        cursor = self.connection.cursor()
        # 将值以参数形式传给execute,而非拼入SQL语句
        cursor.execute(query, tuple(column_values.values()))
        cursor.execute("SELECT @@IDENTITY AS ID;")
        last_inserted_id = cursor.fetchone()[0]
        self.connection.commit()
        print("Data inserted successfully.")
        return last_inserted_id
    except Exception as e:
        print(f"Error inserting data: {e}")
    finally:
        cursor.close()

2. 确认数据库字段类型

确保存储特殊字符的表字段类型为NVARCHAR/NCHAR/NTEXT(Unicode类型),而非VARCHAR/CHAR/TEXT(单字节编码类型)。若字段是单字节类型,即便代码逻辑正确,插入后仍会出现乱码。

3. 调整连接编码设置(可选)

如果参数化查询后仍有问题,将连接的编码设置调整为SQL Server默认的Unicode编码UTF-16LE:

self.connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
self.connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-16le')
self.connection.setencoding(encoding='utf-16le')

同时移除连接字符串中的CHARSET=UTF-8——ODBC Driver for SQL Server不支持该参数,添加后反而可能引发编码冲突。

验证逻辑

  • 执行修改后的代码,插入特殊字符后查看数据库显示状态。
  • 若仍有异常,检查JSON读取环节:打印type(value)和repr(value)确认json.load后的值为正确的Unicode字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:43:10