如何使用Python pypyodbc获取完整的VARCHAR(MAX)列

8

我有一个Python程序,使用ODBC连接连接到MSSQL数据库。我使用的Python库是pypyodbc。

这是我的配置:

  • Windows 8.1 x64
  • SQL Server 2014 x64
  • Python 2.7.9150
  • PyPyODBC 1.3.3
  • ODBC驱动程序:SQL Server Native Client 11.0

我遇到的问题是,当我查询一个带有varchar(max)列的表时,内容被截断了。

我对pypyodbc还很陌生,我一直在搜索解决办法,但没有找到任何关于如何防止这种情况发生的方法,即使使用搜索词我也找不到。我甚至尝试在我的SQL查询中添加SET TEXTSIZE 2147483647;,但数据仍然被截断。

我该如何防止这种情况发生?或者你能指导我吗?

更新:

因此,我尝试在我的SQL查询中执行转换。当我使用CAST(my_column as VARCHAR(MAX))时,它在相同的位置截断。但是,如果我使用CAST(my_column as VARCHAR(8000)),它会给我更多的文本内容,但仍然截断了一些内容。如果我尝试使用大于8000的数字,我会收到错误消息,指出8000是可以使用的最大值。有人知道这里可能发生了什么吗?看起来使用MAX不起作用。


1
我能够使用pypyodbc重新创建你的问题:我的来自VARCHAR(MAX)列的9386个字符的文本被截断为2047个字符。当我改用pyodbc而不是pypyodbc时,完全相同的Python代码返回了完整的字符串。 - Gord Thompson
@GordThompson 谢谢您的评论。最近我尝试使用 pyodbc 而不是 pypyodbc,但出现了一些问题,无法完全返回我的数据集。可能这个问题与其他事情无关,但在尝试 pyodbc 后不久,我找到了一个可行的解决方案(我刚刚发布了它作为答案),最终放弃了 pyodbc 的想法。如果我有时间,我会尝试完全实现 pyodbc 作为测试。这样我就可以发布我的发现,供那些可能遇到这个问题的人参考;如果我的其他解决方案对他们不起作用的话。再次感谢! - CM-Dev
3个回答

12

好的,我最终解决了这个问题。我找到了一个关于类似问题的链接,只是不是关于Python的,他们发现问题出在SQL Server本地客户端驱动程序上。他们建议改用SQL Server标准驱动程序。

所以我将ODBC连接字符串中的驱动程序从 SQL Server Native Client 11.0更改为SQL Server,现在它工作得非常完美!我已成功获取了MSSQL数据表中VARCHAR(MAX)列的全部内容。

我真心希望这对任何遇到此问题的人有所帮助!祝你好运!

以下是链接地址: http://www.sqlservercentral.com/Forums/Topic1534163-391-1.aspx


9
"{SQL Server}"在我的情况下无法工作。如果数据库在我的本地机器上,则"{SQL Server}"可以完美地工作。但是,如果我尝试连接到远程服务器,总是会返回下面的错误消息:pypyodbc.DatabaseError:('08001','[08001] [Microsoft] [ODBC SQL Server Driver] [DBNETLIB] SSL安全错误')
对于那些仍在苦苦挣扎于VARCHAR(MAX)截断的人,我的同事想出了一个绝妙的解决方法,就是将VARCHAR(MAX)转换为TEXT类型。
假设我们有一个名为note的列,其数据类型为VARCHAR(MAX),不要使用SELECT note FROM notebook,而要写成SELECT CAST(note AS TEXT) FROM notebook
希望能对你有所帮助!

2

假设你正在使用FreeTDS,因为我之前也遇到过这个问题。在你的freetds.conf文件中,很可能是在[global]下面:

[global]
text size = 64512

根据你的 SQL Server 版本,将其更改为:
[global]
text size = 4294967295

您还需要更改您的DSN之一。

如果这不是问题,我们需要更多信息:您是从Linux还是Windows连接?使用哪个版本的SQL Server?使用哪个驱动程序进行连接?


我不相信那是问题所在,那只适用于我使用 Linux 吗?我是从 Windows 机器连接的。这是我为ODBC连接使用的驱动程序:SQL Server Native Client 11.0 - CM-Dev
有没有类似的方法可以让我改变pypyodbc连接器的文本大小属性? - CM-Dev
啊,那种情况下不适用。你之前没有说明你在使用Windows系统,所以我才会说“我假设你正在使用FreeTDS”,因为我之前遇到过这个问题。你能否修改你的问题并包括以下信息:你正在使用的是哪个版本的Windows系统(32位还是64位),你的SQL Server版本(32位还是64位),Python版本(32位还是64位),pypyodbc版本和驱动程序?这些信息肯定会有所帮助。 - FlipperPA
我完全理解。是的,我一定会把那个加到我的问题里。在我这么做的时候,你知道有没有一个Windows解决方案可以尝试吗?不幸的是,我还没有找到一个。 - CM-Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接