SQL 服务器 NText 字段限制为 43,679 个字符?

SQL Server NText field limited to 43,679 characters?

我使用 SQL 服务器数据库来存储很长的 Unicode 字符串。该字段来自 'ntext' 类型,理论上应限制为 2^30 个 Unicode 字符。

来自MSDN documentation

ntext

Variable-length Unicode data with a maximum string length of 2^30 - 1 (1,073,741,823) bytes. Storage size, in bytes, is two times the string length that is entered. The ISO synonym for ntext is national text.

我做了这个测试:

  1. 生成50,000个字符的字符串。

  2. 运行 更新 SQL 语句

    更新[table] SET Response='... 50,000 个字符串...' 其中 ID='593BCBC0-EC1E-4850-93B0-3A9A9EB83123'

  3. 检查结果 - 最后字段中实际存储的内容。

结果是字段 [Response] 包含 仅 43,679 个字符。字符串末尾的所有字符都被丢弃了。

为什么会这样?我该如何解决这个问题?

如果这真的是这种数据类型(ntext)的容量限制,还有哪种数据类型可以存储更长的 Unicode 字符串?

NTEXT 数据类型已弃用,您应该使用 NVARCHAR(MAX).

我看到两种可能的解释:

  1. 您用来连接数据库的 ODBC 驱动程序在太长时截断参数值(尝试使用 SSMS

  2. 你写你生成你的输入字符串。我怀疑你生成的 CHAR(0)Null literal

如果是第二种情况,请确保您不能生成 [=19=] 个字符。

编辑:

我不知道你是如何检查长度的,但请记住 LEN 不计算尾随空格

SELECT LEN('aa     ')        AS length          -- 2
      ,DATALENGTH('aa     ') AS datalength      -- 7

最后一个可能的解决方案,我看到你做了这样的事情:

SELECT 'aa                aaaa' 

-- result in SSMS `aa aaaa`: so when you count you lose all multiple whitespaces

检查下面的查询如果 returns 100k:

SELECT DATALENGTH(ntext_column)

据我所知,您可能只能复制 43679 个字符。它正在存储所有字符,它们在数据库中(使用 [Select Len(Reponse) From [table] Where... 验证这一点),并且 SSMS 在复制超过当你去查看完整数据时。

对于所有字节;右键单击网格结果并单击将结果保存到文件。

可以确认。实际限制是 43679。订阅服务出现问题已经一周了。每个数据看起来都不错,但它仍然给我们一个错误,其中一个字段具有无效值,即使如此,它也得到了正确的值。事实证明,参数存储在 NText 中,并且最大长度为 43679 个字符。而且因为我们无法更改数据库设计,所以我们不得不为同一事物进行 2 次不同的订阅,并将一半的实体放入另一个。