【问题标题】:SQL Server NText field limited to 43,679 characters?SQL Server NText 字段限制为 43,679 个字符?
【发布时间】:2016-02-01 07:39:57
【问题描述】:

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

来自MSDN documentation

文本

可变长度 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. 检查结果 - 最后实际存储在字段中的内容。

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

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

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

【问题讨论】:

标签: sql sql-server sql-update ntext


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是我的问题解决方案。我从 DBMS 字段复制,但我只得到 43679 个字符。为什么?所以我将数据库中的 ntext 字段直接保存到文件中,所有字符都在那里。谢谢
      【解决方案4】:

      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)
      

      【讨论】:

      • 1) 我在“Sql Management Studio”上运行 SQL。 2) 字符串中没有 Char(0) - 当然。
      • @No1Lives4Ever 尝试SELECT DATALENGTH(ntext_column) 如果它返回 100k 一切正常
      • 这可能是管理工作室的极限。当您从 odbc/ado 连接运行查询时会发生什么?
      • 我将 NText 更改为 nVarChar(Max),并使用实体框架 (C#) 进行了测试 - 现在可以正常工作了。
      猜你喜欢
      • 2011-01-09
      • 2010-10-15
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      相关资源
      最近更新 更多