6

我目前正在尝试从我们限制从 Linux Web 服务器访问的 SQL Server 数据库视图中提取一些数据。

我们不需要编辑数据,只需将其显示在网页中即可。

在我们尝试输出并且只获取文本字段的前 255 个字符之前,一切看起来都很好。

有谁知道这是否是通过 PHP::PDO 使用 FreeTDS 的问题,还是应该可以正常工作?我见过其他人有类似的问题,但似乎没有很多答案。

我使用它作为 MS SQL 数据库的连接字符串:

$dbConn = new PDO("odbc:Driver=FreeTDS;DSN=OURDSN;UID=WWWUser;PWD=ourpassword");
4

4 回答 4

9

根据FreeTDS 用户指南,问题似乎是 FreeTDSvarchar在与 SQL Server 对话时最多只能处理 255 个字符,“由于协议定义中固有的限制”。任何比这更大的东西都需要是 data type text

您可以通过相应地修改架构或在查询期间转换数据类型来解决问题,如下所示:

SELECT CAST(mycol as TEXT) FROM mytable
于 2010-03-09T15:09:04.050 回答
2

您可以增加 FreeTDS 使用的 /etc/odbc.ini 文件中文本字段的大小。

[name_of_connection]
TextSize = 2097152

您还可以尝试使用 PHP 低级 odbc 例程来确保您可以获得该级别的数据检索,然后再继续使用 PDO。

于 2010-03-09T14:54:25.530 回答
1

默认情况下,FreeTDS 使用协议版本 4.2 如果您将协议升级到 7.0,您可以检索超过 255 个字节的 varchar。您可以使用“CAST”hack,也可以使用 ALTER COLUMN col varchar(max)。

varchar(max) 是与 varchar 完全不同的列类型(DATA_TYPE 2005 vs 12),将通过 freetds 4.2 流式传输,不进行截断。

为什么不升级到版本 7?因为 UTF-8 不能使用较新的协议存储在 varchar 中。SQL Server 将在 UCS-2(如 UTF-16)中传输所有协议信息,并在保存之前将您的数据转换为表或列排序规则。但是,这需要您在 UTF8 数据前加上 N.INSERT 到 tbl (txt) 值 (N'hello world')

为什么不投?CAST AS TEXT 与 MySQL 不兼容(需要做 CAST AS CHAR)。

保持协议 4.2 并将您的 varchars 定义为 varchar(max) 让您编写最兼容的 SQL。

于 2014-06-13T21:49:39.883 回答
0

这个问题的另一个事实。截至 2015 年,返回 XML 类型的值会导致前 25 6 个字符被干净地返回。但是,XML 的其余大部分将作为明显的随机垃圾返回,偶尔会有清晰的文本片段。事实上,如果我不得不猜测,查询会为 256 之后的所有字符返回一个随机的内存块。

在我的具体情况下,我正在生成 XML(使用多个 FOR XML 嵌套查询)以发送到网站进行显示。在这种情况下,我找到的解决方案是使用 CAST hack,将数据转换为 varchar(max)。

所以请记住:如果您在查询结果中看到一个由 256 个清晰字符组成的块,然后是随机垃圾,那么它可能是作为 XML 类型而不是 varchar(max) 类型返回的 XML 值。

警告:这可能仅适用于动态生成 XML 的情况。

于 2015-11-17T02:10:36.153 回答