SQL Server NText字段限制为43,479个字符?

时间:2015-11-01 08:20:56

标签: sql sql-server sql-update ntext

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

来自MSDN documentation

  

NTEXT

     

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

我做了这个测试:

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

  2. 运行更新SQL语句

    更新[表格] SET Response =' ... 50,000字符串......' 在哪里ID =' 593BCBC0-EC1E-4850-93B0-3A9A9EB83123'

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

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

    为什么会这样?我怎么解决这个问题?

    如果这确实是此数据类型(ntext)的容量限制,哪个其他数据类型可以存储更长的Unicode字符串?

4 个答案:

答案 0 :(得分:2)

不推荐使用

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

我看到两种可能的解释:

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

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

  3. 如果是第二种情况,请确保无法生成\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)
    

答案 1 :(得分:0)

根据我所看到的情况,您可能只能复制43679个字符。它存储了所有字符,它们位于数据库中(使用Select Len(Reponse)检查这个来自[table] Where ...来验证这一点),并且SSMS的复制问题比你去看看时更多数据

答案 2 :(得分:0)

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

答案 3 :(得分:0)

可以确认。实际限制为43679。订阅服务在一周内出现问题。每个数据看起来都不错,但是仍然给我们一个错误,即其中一个字段具有无效值,甚至可以输入正确的值。结果证明,参数存储在NText中,并且最大值为43679个字符。而且由于我们无法更改数据库设计,因此我们必须为同一事物进行2个不同的订阅,并将一半实体分配给另一实体。