【问题标题】:SQL Server Text Datatype Maxlength = 65,535?SQL Server 文本数据类型最大长度 = 65,535?
【发布时间】:2022-02-24 18:16:12
【问题描述】:

我正在使用的软件使用文本字段来存储 XML。根据我的在线搜索,文本数据类型应该包含 2^31 - 1 个字符。目前,SQL Server 每次将 XML 截断为 65,535 个字符。我知道这是由 SQL Server 引起的,因为如果我直接在 Management Studio 中将第 65,536 个字符添加到列中,它会声明它不会更新,因为字符将被截断。

最大长度真的是 65,535,还是因为数据库是在早期版本的 SQL Server (2000) 中设计的,并且使用的是旧版 text 数据类型而不是 2005 年的数据类型?

如果是这种情况,在 SQL Server 2005 中将数据类型更改为 Text 会解决此问题吗?

【问题讨论】:

  • 它是同步过程中镜像数据库的一部分。我希望避免修改所有客户端的字段。

标签: sql-server text types


【解决方案1】:

这是 SSMS 的限制,而不是文本字段的限制,但您应该使用 varchar(max),因为不推荐使用文本

这里也是一个快速测试

create table TestLen (bla text)

insert TestLen values (replicate(convert(varchar(max),'a'), 100000))

select datalength(bla)
from TestLen

为我返回 100000

【讨论】:

  • 你让我免于重建前端系统!从前端查看一些导入的数据时,我看到了 65535 的限制,这意味着我将不得不将文件大小限制为小于 65k 个字符,哈哈。我现在可以看到被截断的只是 SSMS 结果,而不是数据本身。非常感谢!
【解决方案2】:

MSSQL 2000 应允许在文本字段中最多包含 2^31 - 1 个字符(非 unicode),超过 20 亿。不知道是什么导致了这种限制,但您可能想尝试使用 varchar(max) 或 nvarchar(max)。这些存储尽可能多的字符,但也允许常规的字符串 T-SQL 函数(如 LEN、SUBSTRING、REPLACE、RTRIM...)。

【讨论】:

  • 事实上 nvarchar 只存储一半的字符数,因为它是 unicode 并且每个字符使用 2 个字节。
【解决方案3】:

如果您能够转换列,那么您也可以这样做,因为在 SQL Server 的未来版本中将删除 text 数据类型。 See here.

建议使用varchar(MAX)nvarchar(MAX)。在您的情况下,您也可以使用 XML 数据类型,但这可能会将您绑定到某些数据库引擎(如果这是一个考虑因素)。

【讨论】:

    【解决方案4】:

    你应该看看

    所以我宁愿尝试使用适合使用的数据类型。 未使以前版本的数据类型适合您的使用。

    【讨论】:

      【解决方案5】:

      这是我为获取所有数据而编写的一个小脚本

          SELECT @data = N'huge data';
      
          DECLARE @readSentence NVARCHAR (MAX) = N'';
      
      
          DECLARE @dataLength INT = ( SELECT LEN (@data));
      
      
          DECLARE @currIndex INT = 0;
      
          WHILE @data <> @readSentence
              BEGIN
      
                  DECLARE @temp NVARCHAR (MAX) = N'';
      
      
                  SET @temp = ( SELECT SUBSTRING (@data, @currIndex, 65535));
      
      
                  SELECT @temp;
      
                  SET @readSentence += @temp;
      
      
                  SET @currIndex += 65535;
      
      
              END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多