为什么SQL Server选择查询truncate varchar string?

时间:2015-07-23 16:58:34

标签: php sql-server varchar

设置

我正在使用几个内存表来缓存我网站的数据。这是我的mac上的本地web主机和linux上的dev服务器,使用php 5.5上的mssql php库

简化表格如下:

CacheID INT NOT NULL
CacheData VARCHAR(MAX)

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

SELECT
  CacheID,
  LEN(CacheData)
FROM Caches

问题

但是,当我实际选择数据时,cache列始终会被截断为8192个字符,从而导致出现问题。简单选择:

SELECT
  CacheData
FROM Caches
WHERE CacheID = 10

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

问题

为什么数据被截断?

另一种形式的问题。我实际上遇到了这个agian而忘记了这个解决方案。当我忘记根本原因时,请记住我。以下是我搜索认为SQL Server是罪魁祸首的原因。

什么是SQL Servers Varchar(MAX)最大长度? - 如果你的值被截断,可能是由php非sql server引起的。如果您只是想知道最大值是什么,请在此处回答问题:Maximum size of a varchar(max) variable

1 个答案:

答案 0 :(得分:6)

披露

回答我自己的问题。只是把它发布在这里是因为我花了一个多小时来解决这个问题,所以对它有一个直截了当的答案会很好。 我已经看到类似的堆栈溢出问题,但它们非常特定于一个用例,或者措辞不好,搜索结果无法找到它们

答案(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),它将textlimit硬编码为64 kb。您可以通过在长查询之前传递以下查询来覆盖此问题:SET TEXTSIZE -1

其他相关问题

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