我在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,)]
像ids的完全转储一样
>>> 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归类或ntext数据中的Unicode数据不能使用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.
我已经搜索高低,调查了here和here的解决方案,并重新编译了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 =
任何建议或方向将非常感谢!