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

yipeiwu_com7年前Python基础

下面是调用方式:

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

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

相关文章

Python利用正则表达式实现计算器算法思路解析

  (1)不使用eval()等系统自带的计算方法   (2)实现四则混合运算、括号优先级解析 思路:   1、字符串预处理,将所有空格去除   2、判断是否存在括号运算,若存在进行第3步...

Python基于property实现类的特性操作示例

本文实例讲述了Python基于property实现类的特性操作。分享给大家供大家参考,具体如下: Python中的特性是一个函数,但是在使用的形式上看起来更像是一个属性。针对一个对象来说...

python PyTorch预训练示例

前言 最近使用PyTorch感觉妙不可言,有种当初使用Keras的快感,而且速度还不慢。各种设计直接简洁,方便研究,比tensorflow的臃肿好多了。今天让我们来谈谈PyTorch的预...

Python时间戳使用和相互转换详解

本文实例为大家分享了Python时间戳使用和相互转换的具体代码,供大家参考,具体内容如下 1.将字符串的时间转换为时间戳 方法:    &nbs...

如何使用pyinstaller打包32位的exe程序

如何使用pyinstaller打包32位的exe程序

说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位。而64位的exe文件在32位的win7操作系统下是无法执行的,显示不兼容。网上查询发现,简...