当前位置: 首页 > 图文教程 > 脚本技术 > Python > pymssql ntext字段调用问题解决方法

Python
Python 调用DLL操作抄表机
python 输出一个两行字符的变量
用Python的urllib库提交WEB表单
Python 返回汉字的汉语拼音
python mysqldb连接数据库
python 判断自定义对象类型
Python字符串的encode与decode研究心得乱码问题解决方法
python 获取文件列表(或是目录例表)
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
python 获取et和excel的版本号
python ElementTree 基本读操作示例
python 判断一个进程是否存在
python thread 并发且顺序运行示例
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Python 解析XML文件
asp Http_Referer,Server_Name和Http_Host
Python 自动安装 Rising 杀毒软件
用python实现的可以拷贝或剪切一个文件列表中的所有文件
Python 正则表达式操作指南
python ip正则式

Python 中的 pymssql ntext字段调用问题解决方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 164 ::
收藏到网摘: n/a

pymssql是python用来连接mssql数据库的一个类库。该库遵守Python DB API 2.0 标准,并且还附带了一个原生的低阶数据访问模块。

下面是调用方式:

Example script - pymssql module (DB API 2.0)

Example script - _mssql module (lower level DB access)

不过,在我使用过程中,发现,如果表中包含了ntext字段,就会出错,提示

不能用 DB-Library(如 ISQL)或 ODBC 3.7 或更早版本将 ntext 数据或仅使用
Unicode排序规则的 Unicode 数据发送到客户端。

查了一下,发现官方网站有解释:

Q: What means "Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library"?

A: If you connect to a SQL Server 2000 SP4 or SQL Server 2005, and if you make a SELECT query on a table that contains a column of type NTEXT, you may encounter the following error:
_mssql.error: SQL Server message 4004, severity 16, state 1, line 1:
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.

It's the SQL Server complaining that it doesn't support pure Unicode via TDS or older versions of ODBC. There's no fix for this error. Microsoft has deprecated DB-Library a long ago, in favor of ODBC, OLE DB, or SQL Native Client. Many new features of SQL 2005 aren't accessible via DB-Library so if you need them, you have to switch away from pymssql or other tools based on TDS and DB-Library.

A workaround is to change the column type to NVARCHAR (it doesn't exhibit this behaviour), or TEXT.

大概意思是,这是因为我们的pymssql使用早期的ODBC函数集来获取数据。后来微软才引入了ntext和nvarchar类型,但Microsoft并没有更新他们的 C-library,所以就没办法支持了。建议:将ntext修改为nvarchar或text.

显然,这不是个好的解决方法,那么是否就没有其他办法了呢?

还好,不用绝望,既然不支持ntext但支持text,那么我们只需要在输出时将ntext转换为text就好了,方法很简单:

SELECT cast ( field_name AS TEXT ) AS field_name

唯一的问题,可能是ntext和text字段所支持的长度不一样,所以也许你还需要设置一下TEXTSIZE

SET TEXTSIZE 65536

当然,你还可以将字段设置的大一点,这个就看你的需要了。