5

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

MSDN 文档

文本

最大字符串长度为 2^30 - 1 (1,073,741,823) 字节的可变长度 Unicode 数据。存储大小(以字节为单位)是输入的字符串长度的两倍。ntext 的 ISO 同义词是国家文本。

我做了这个测试:

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

  2. 运行更新 SQL 语句

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

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

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

为什么会发生这种情况?我该如何解决这个问题?

如果这真的是这种数据类型(ntext)的容量限制,那么另一种数据类型可以存储更长的Unicode字符串吗?

4

4 回答 4

2

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

我看到两种可能的解释:

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

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

如果第二种情况是您的情况,请确保您无法生成\0字符。

编辑:

我不知道您如何检查长度,但请记住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

如果返回100k,请检查以下查询:

SELECT DATALENGTH(ntext_column)
于 2015-11-01T08:32:43.753 回答
2

根据我所见,您可能只能复制 43679 个字符。它正在存储所有字符,它们在数据库中(使用 Select Len(Reponse) From [table] Where... 进行检查以验证这一点),并且 SSMS 在复制时遇到的问题比您查看完整时更多数据。

于 2016-09-01T20:07:12.410 回答
1

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

于 2017-04-20T08:03:19.483 回答
0

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

于 2019-09-03T15:17:48.537 回答