我正在使用几个内存表来缓存我网站的数据。这是我的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
答案 0 :(得分:6)
回答我自己的问题。只是把它发布在这里是因为我花了一个多小时来解决这个问题,所以对它有一个直截了当的答案会很好。 我已经看到类似的堆栈溢出问题,但它们非常特定于一个用例,或者措辞不好,搜索结果无法找到它们
php的mssql模块在php.ini文件中有几个默认设置。其中一个设置是mssql.textlimit
和mssql.textsize
。这些设置会将任何基于文本的字段(varchar,text,nvarchar)截断为它们设置的大小。
我见过截断位于8192和4096的帖子。所以我假设其中任何一个都是默认的。我把我的上升到65535(2 ^ 16 - 1)。
我最近开始迁移到PDO,发现mssql直接答案不适用于pdo。
PDO似乎有一个错误(not a bug but kind of a bug),它将textlimit硬编码为64 kb。您可以通过在长查询之前传递以下查询来覆盖此问题:SET TEXTSIZE -1
。
作为旁注,我还专门针对SQL Server Management Studio中的查询结果看到了类似的问题。程序中有几个限制可以显示或导出多少个字符。此外,程序中还有一些设置用于编辑显示/导出的字符数。有关此问题的更多信息here。