gpt4 book ai didi

sql-server-2008 - Debian Linux 上的 pyodbc/FreeTDS/unixODBC : issues with TDS Version

转载 作者:行者123 更新时间:2023-12-03 20:27:58 25 4
gpt4 key购买 nike

我在 Debian Lenny (5.0.7) 上成功使用 pyodbc 时遇到了一些麻烦。具体来说,我似乎在获取 NVARCHAR 值时遇到了麻烦(不是 SQL Server 专家,所以对我放轻松:))。

大多数传统查询工作正常。例如, table1 中的行数产生

cursor.execute("SELECT count(id) from table1")
<pyodbc.Cursor object at 0xb7b9b170>
>>> cursor.fetchall()
[(27, )]

就像完整的 id 转储一样
>>> cursor.execute("SELECT id FROM table1")
<pyodbc.Cursor object at 0xb7b9b170>
>>> cursor.fetchall()
[(0.0, ), (3.0, ), (4.0, ), (5.0, ), (6.0, ), (7.0, ), (8.0, ), (11.0, ), (12.0, ), (18.0, ), (19.0, ), (20.0, ), (21.0, ), (22.0, ), (23.0, ), (24.0, ), (25.0, ), (26.0, ), (27.0, ), (28.0, ), (29.0, ), (32.0, ), (33.0, ), (34.0, ), (35.0, ), (36.0, ), (37.0, )]

但是名称的转储(同样是 NVARCHAR 类型)不会
>>> cursor.execute("SELECT name FROM table1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier. (4004) (SQLExecDirectW)')

... 关键错误是

pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Unicode 数据在仅 Unicode 归类或 ntext 数据中不能发送到使用 DB-Library(如 ISQL)或 ODBC 版本 3.7 或(4004) (SQLExecDirectW)')

这是跨表一致的。

我已经尝试了各种不同的版本,但现在我正在运行 unixODBC 2.2.11(来自 lenny repos)、FreeTDS 0.91(从源代码构建,使用 ./configure --enable-msdblib --with-tdsver=8.0)和 pyodbc 3.0.3(从源代码构建) )。

使用类似的组合(unixODBC 2.3.0、FreeTDS 0.91、pyodbc 3.0.3),相同的代码可以在 Mac OS X 10.7.2 上运行。

我搜索了高低,调查了提出的解决方案 herehere并重新编译不同版本的 unixODBC 和 FreeTDS,但仍然没有骰子。相关配置文件提供如下:
user@host:~$ cat /usr/local/etc/freetds.conf
#$Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".

# Global settings are overridden by those in a database
# server specific section
[global]
# TDS protocol version
tds version = 8.0
client charset = UTF-8

# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
; dump file = /tmp/freetds.log
; debug flags = 0xffff

# Command and connection timeouts
; timeout = 10
; connect timeout = 10

# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512

# A typical Sybase server
[egServer50]
host = symachine.domain.com
port = 5000
tds version = 5.0

# A typical Microsoft server
[egServer70]
host = ntmachine.domain.com
port = 1433
tds version = 8.0

[foo]
host = foo.bar.com
port = 1433
tds version = 8.0

user@host:~$ cat /etc/odbc.ini
[foo]
Description = Foo
Driver = foobar
Trace = No
Database = db
Server = foo.bar.com
Port = 1433
TDS_Version = 8.0
user@host:~$ cat /etc/odbcinst.ini
[foobar]
Description = Description
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =

任何建议或方向将不胜感激!

最佳答案

我在 Ubuntu 上遇到了同样的错误。我通过一个变通办法“解决”了它。
您需要做的就是设置环境变量 TDSVER。

import os
os.environ['TDSVER'] = '8.0'

正如我所说,这不是一个真正的“解决方案”,但它有效。

关于sql-server-2008 - Debian Linux 上的 pyodbc/FreeTDS/unixODBC : issues with TDS Version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com