为什么 SQL 服务器 select 查询截断 varchar 字符串?

Why does SQL Server select query truncate varchar string?

设置

我正在使用多个内存 table 来为我的网站缓存数据。这是我的 mac 上的本地 Web 主机和 linux 上的开发服务器,使用 php 5.5

上的 mssql php 库

简化的 table 看起来像:

CacheID INT NOT NULL
CacheData VARCHAR(MAX)

我偶尔会插入几个大值。 10,000 多个字符。插入工作正常。一个简单的查询告诉我所有数据都在字段中:

SELECT
  CacheID,
  LEN(CacheData)
FROM Caches

问题

但是,当我实际上 select 数据时,cache 列总是被截断为 8192 个字符,从而导致问题。简单 select:

SELECT
  CacheData
FROM Caches
WHERE CacheID = 10

我检查了 varchar(max) 字符限制。而且远远超过8192。2^32 - 1

问题

为什么数据被截断了?

另一种形式的问题。我实际上 运行 进入了这个 agian 而忘记了这个解决方案。花了我一点时间来记住,因为我忘记了根本原因。这是我认为 SQL 服务器是罪魁祸首的搜索结果。

什么是 SQL Servers Varchar(MAX) 最大长度? - 如果您的值被截断可能是由 php 非 sql 服务器。如果你只是想知道最大值是多少,这里回答了这个问题:Maximum size of a varchar(max) variable

披露

回答我自己的问题。只是将它发布在这里,因为我花了一个多小时来解决这个问题,如果能有一个直截了当的答案就好了。 我在堆栈溢出上看到过类似的问题,但它们非常针对用例,或者措辞不佳,无法通过搜索结果找到

回答(mssql直接)

php 的 mssql 模块在 php.ini 文件中有几个默认设置。其中一个设置是 mssql.textlimitmssql.textsize。这些设置会将任何基于文本的字段(varchar、text、nvarchar)截断为它们设置的大小。

我看到截断是在 8192 和 4096 上的帖子。所以我假设其中任何一个都可以是默认值。我将我的提高到 65535 (2^16 - 1)。

答案(mssql 通过 pdo)

我最近开始迁移到 PDO,发现 mssql 直接回答不适用于 pdo。

PDO 似乎有一个错误 (not a bug but kind of a bug) 将文本限制硬编码为 64 kb。您可以通过在长查询之前传递以下查询来覆盖它:SET TEXTSIZE -1.

其他相关问题

作为旁注,我也看到了类似的问题,专门针对 SQL Server Management Studio 中的查询结果。对于可以显示或导出的字符数,程序中存在一些限制。程序中还有一些设置可以编辑字符数 displayed/exported。有关此问题的更多信息 here