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
相关产品推荐
相关产品推荐

