pyodbc fast_executemany on Linux 插入时乱码字符串
pyodbc fast_executemany on Linux garbles strings on insert
我有以下代码,在 Windows 上运行良好,但在 Linux 上运行失败:
import pyodbc
conn = pyodbc.connect(p_str = None, server = ..., app = ..., databsae = ...,
driver = '{ODBC Driver 17 for SQL Server}',
Trusted_Connection = 'yes')
conn.setdecoding(pyodbc.SQL_CHAR, encoding = 'utf-8')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding = 'utf-8')
conn.setencoding(encoding = 'utf-8')
sql = 'INSERT INTO TestStrTbl(idKey,idValue) VALUES (?,?)'
data = [('one', 'value1'), ('two', 'value2')]
cursor = conn.cursor()
cursor.connection.autocommit = False
cursor.fast_executemany = True
cursor.executemany(sql, data)
cursor.commit()
我正在插入并清空 SQL 服务器 table,使用以下 SQL 创建:
CREATE TABLE TestStrTbl
(
idKey varchar(20) NOT NULL PRIMARY KEY,
idValue varchar(20) NOT NULL
)
返回的错误是:
Violation of PRIMARY KEY constraint 'PK__TestStrT__3FBEE7404FA9AB3B'.
Cannot insert duplicate key in object 'dbo.TestStrTbl'. The duplicate
key value is (?).
当我使用相同的连接读取或使用完整的字符串插入时,例如
sql = "INSERT INTO TestStrTbl(idKey,idValue) VALUES ('%s','%s')"
cursor.connection.autocommit = False
cursor.fast_executemany = True
for row in data:
cursor.execute(sql % row)
cursor.commit()
这很好用。另一种可能性是让 cursor.fast_executemany = False
,那么它也会在 Linux 上工作。我该怎么做才能解决这个问题?
我 运行 Python 3.7.8 pyodbc==4.0.24
Ubuntu Linux。
感谢您的帮助。
更新
这里是 unixODBC 设置:
18:48:56 $> odbcinst -j
unixODBC 2.3.1
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/myUserId/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
使用 Microsoft 的 SQL 服务器的 ODBC 驱动程序时,无需调用 conn.setdecoding
和 conn.setencoding
。 pyodbc 的默认编码是 UTF16-LE,这是 Microsoft 的 ODBC 驱动程序使用的。
至于 unixODBC,版本 2.3.5 (2018-01-02) 之前的任何内容都应视为“旧”版本,因为这是一个主要的错误修复版本。版本2.3.7 (2018-08-10) 修复了几个bug,目前是推荐版本
我有以下代码,在 Windows 上运行良好,但在 Linux 上运行失败:
import pyodbc
conn = pyodbc.connect(p_str = None, server = ..., app = ..., databsae = ...,
driver = '{ODBC Driver 17 for SQL Server}',
Trusted_Connection = 'yes')
conn.setdecoding(pyodbc.SQL_CHAR, encoding = 'utf-8')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding = 'utf-8')
conn.setencoding(encoding = 'utf-8')
sql = 'INSERT INTO TestStrTbl(idKey,idValue) VALUES (?,?)'
data = [('one', 'value1'), ('two', 'value2')]
cursor = conn.cursor()
cursor.connection.autocommit = False
cursor.fast_executemany = True
cursor.executemany(sql, data)
cursor.commit()
我正在插入并清空 SQL 服务器 table,使用以下 SQL 创建:
CREATE TABLE TestStrTbl
(
idKey varchar(20) NOT NULL PRIMARY KEY,
idValue varchar(20) NOT NULL
)
返回的错误是:
Violation of PRIMARY KEY constraint 'PK__TestStrT__3FBEE7404FA9AB3B'. Cannot insert duplicate key in object 'dbo.TestStrTbl'. The duplicate key value is (?).
当我使用相同的连接读取或使用完整的字符串插入时,例如
sql = "INSERT INTO TestStrTbl(idKey,idValue) VALUES ('%s','%s')"
cursor.connection.autocommit = False
cursor.fast_executemany = True
for row in data:
cursor.execute(sql % row)
cursor.commit()
这很好用。另一种可能性是让 cursor.fast_executemany = False
,那么它也会在 Linux 上工作。我该怎么做才能解决这个问题?
我 运行 Python 3.7.8 pyodbc==4.0.24
Ubuntu Linux。
感谢您的帮助。
更新
这里是 unixODBC 设置:
18:48:56 $> odbcinst -j
unixODBC 2.3.1
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/myUserId/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
使用 Microsoft 的 SQL 服务器的 ODBC 驱动程序时,无需调用 conn.setdecoding
和 conn.setencoding
。 pyodbc 的默认编码是 UTF16-LE,这是 Microsoft 的 ODBC 驱动程序使用的。
至于 unixODBC,版本 2.3.5 (2018-01-02) 之前的任何内容都应视为“旧”版本,因为这是一个主要的错误修复版本。版本2.3.7 (2018-08-10) 修复了几个bug,目前是推荐版本