【问题标题】:Why does SQL Server select query truncate varchar string?为什么 SQL Server 选择查询会截断 varchar 字符串?
【发布时间】:2015-07-23 16:58:33
【问题描述】:

设置

我正在使用多个内存表来缓存我的网站的数据。这是我的 mac 上的本地 web 主机和 linux 上的开发服务器,使用 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 Server 的 Varchar(MAX) 最大长度? - 如果您的值被截断,它可能是由 php 非 sql server 引起的。如果你只是想知道最大值是多少,问题在这里得到解答:Maximum size of a varchar(max) variable

【问题讨论】:

    标签: php sql-server varchar


    【解决方案1】:

    披露

    回答我自己的问题。把它贴在这里是因为我花了一个多小时才找到这个问题,如果能有一个直截了当的答案就好了。 我在堆栈溢出方面看到过类似的问题,但它们对用例非常具体,或者措辞不佳,无法通过搜索结果找到

    回答(mssql 直接)

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

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

    回答(通过 pdo 的 mssql)

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

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

    其他相关问题

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

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 2015-12-20
      • 2013-09-23
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多