如何使用 Python pypyodbc 获取整个 VARCHAR(MAX) 列
How to get entire VARCHAR(MAX) column with Python pypyodbc
我有一个 Python 程序使用 ODBC 连接到 MSSQL 数据库。我使用的 Python 库是 pypyodbc。
这是我的设置:
- Windows 8.1 x64
- SQL 服务器 2014 x64
- Python 2.7.9150
- PyPyODBC 1.3.3
- ODBC 驱动程序:SQL 服务器本机客户端 11.0
我遇到的问题是,当我使用 varchar(max) 列查询 table 时,内容被截断了。
我是 pypyodbc 的新手,我一直在疯狂地搜索,但找不到任何关于如何防止这种情况在 pypyodbc 甚至 pyodbc 中发生的信息。至少不是我一直在使用的搜索词,我不知道要尝试其他什么词组。
我什至尝试将 SET TEXTSIZE 2147483647;
添加到我的 SQL 查询中,但数据仍然被截断。
如何防止这种情况发生?或者你能给我指明正确的方向吗?
更新:
因此,我尝试在 SQL 查询中执行转换。当我执行 CAST(my_column as VARCHAR(MAX))
时,它会在同一位置截断。但是,如果我这样做 CAST(my_column as VARCHAR(8000))
它会给我更大的文本集,但它仍然会截断一些内容。如果我尝试做任何大于 8000
的事情,我会收到一条错误消息,指出 8000
是我可以使用的最大值。有人知道这里会发生什么吗?使用 MAX
不起作用似乎很奇怪。
我假设您使用的是 FreeTDS,因为我以前见过这个问题。在您的 freetds.conf 文件中,可能在 [global]:
下
[global]
text size = 64512
根据您的 SQL 服务器版本,将其更改为:
[global]
text size = 4294967295
您还需要更改任何 DSN。
如果这不是问题,我们需要更多信息:您是从 Linux 还是 Windows 连接的? SQL 服务器是哪个版本?您使用什么驱动程序进行连接?
好吧,我最终解决了问题。我发现这个 link 关于类似的问题,只是不在 python 中,他们发现问题出在 SQL 服务器本机客户端驱动程序上。他们建议改用 SQL 服务器标准驱动程序。
所以我将我的 ODBC 连接字符串中的驱动程序从 SQL Server Native Client 11.0
更改为 SQL Server
,它工作得很好!我正在获取我的 MSSQL 数据 table.
中 VARCHAR(MAX) 列的全部内容
我真的希望这对遇到此问题的其他人有用!祝你好运!
这是 link:
http://www.sqlservercentral.com/Forums/Topic1534163-391-1.aspx
“{SQL 服务器}”在我的情况下不起作用。如果数据库在我的本地机器上,“{SQL Server}”可以很好地工作。但是,如果我尝试连接到远程服务器,下面的错误消息总是 return:
pypyodbc.DatabaseError: ('08001', '[08001] [Microsoft][ODBC SQL 服务器驱动程序][DBNETLIB]SSL 安全错误')
对于那些仍在 VARCHAR(MAX) 截断中苦苦挣扎的人来说,我的同事提出的一个绝妙的解决方法是 CAST VARCHAR(MAX) 到 TEXT 类型。
假设我们有一个名为 note 的列,其数据类型为 VARCHAR(MAX),而不是使用 SELECT note FROM notebook
,写入 SELECT CAST(note AS TEXT) FROM notebook
。
希望对您有所帮助!
我有一个 Python 程序使用 ODBC 连接到 MSSQL 数据库。我使用的 Python 库是 pypyodbc。
这是我的设置:
- Windows 8.1 x64
- SQL 服务器 2014 x64
- Python 2.7.9150
- PyPyODBC 1.3.3
- ODBC 驱动程序:SQL 服务器本机客户端 11.0
我遇到的问题是,当我使用 varchar(max) 列查询 table 时,内容被截断了。
我是 pypyodbc 的新手,我一直在疯狂地搜索,但找不到任何关于如何防止这种情况在 pypyodbc 甚至 pyodbc 中发生的信息。至少不是我一直在使用的搜索词,我不知道要尝试其他什么词组。
我什至尝试将 SET TEXTSIZE 2147483647;
添加到我的 SQL 查询中,但数据仍然被截断。
如何防止这种情况发生?或者你能给我指明正确的方向吗?
更新:
因此,我尝试在 SQL 查询中执行转换。当我执行 CAST(my_column as VARCHAR(MAX))
时,它会在同一位置截断。但是,如果我这样做 CAST(my_column as VARCHAR(8000))
它会给我更大的文本集,但它仍然会截断一些内容。如果我尝试做任何大于 8000
的事情,我会收到一条错误消息,指出 8000
是我可以使用的最大值。有人知道这里会发生什么吗?使用 MAX
不起作用似乎很奇怪。
我假设您使用的是 FreeTDS,因为我以前见过这个问题。在您的 freetds.conf 文件中,可能在 [global]:
下[global]
text size = 64512
根据您的 SQL 服务器版本,将其更改为:
[global]
text size = 4294967295
您还需要更改任何 DSN。
如果这不是问题,我们需要更多信息:您是从 Linux 还是 Windows 连接的? SQL 服务器是哪个版本?您使用什么驱动程序进行连接?
好吧,我最终解决了问题。我发现这个 link 关于类似的问题,只是不在 python 中,他们发现问题出在 SQL 服务器本机客户端驱动程序上。他们建议改用 SQL 服务器标准驱动程序。
所以我将我的 ODBC 连接字符串中的驱动程序从 SQL Server Native Client 11.0
更改为 SQL Server
,它工作得很好!我正在获取我的 MSSQL 数据 table.
我真的希望这对遇到此问题的其他人有用!祝你好运!
这是 link: http://www.sqlservercentral.com/Forums/Topic1534163-391-1.aspx
“{SQL 服务器}”在我的情况下不起作用。如果数据库在我的本地机器上,“{SQL Server}”可以很好地工作。但是,如果我尝试连接到远程服务器,下面的错误消息总是 return:
pypyodbc.DatabaseError: ('08001', '[08001] [Microsoft][ODBC SQL 服务器驱动程序][DBNETLIB]SSL 安全错误')
对于那些仍在 VARCHAR(MAX) 截断中苦苦挣扎的人来说,我的同事提出的一个绝妙的解决方法是 CAST VARCHAR(MAX) 到 TEXT 类型。
假设我们有一个名为 note 的列,其数据类型为 VARCHAR(MAX),而不是使用 SELECT note FROM notebook
,写入 SELECT CAST(note AS TEXT) FROM notebook
。
希望对您有所帮助!