当前位置: 首页 > 面试题库 >

SQL NVARCHAR和VARCHAR限制

段干子晋
2023-03-14
问题内容

所有,我都有一个大型(不可避免的)动态SQL查询。由于选择标准中字段的数量,包含动态SQL的字符串的长度超过4000个字符。现在,我知道为设置了最大4000
NVARCHAR(MAX),但是在Server Profiler中查看了已执行的SQL语句

DELARE @SQL NVARCHAR(MAX);
SET @SQL = 'SomeMassiveString > 4000 chars...';
EXEC(@SQL);
GO

似乎可以正常工作(!?),对于另一个也很大的查询,它抛出与此4000极限(!?)相关的错误,它基本上会在此4000极限之后修剪所有SQL,并给我留下语法错误。尽管在探查器中有此设置,它仍以
完整 (!?)形式显示此动态SQL查询。

这里到底发生了什么,我应该将这个@SQL变量转换为VARCHAR并继续进行下去吗?

谢谢你的时间。

附言 能够打印出超过4000个字符以查看这些大查询也将是一件很不错的事情。以下仅限于4000

SELECT CONVERT(XML, @SQL);
PRINT(@SQL);

还有其他很酷的方法吗?


问题答案:

我了解最大可设定4000 NVARCHAR(MAX)

您的理解是错误的。nvarchar(max)最多可以存储2GB(有时甚至超过2GB)的数据(10亿个双字节字符)。

从联机丛书中的nchar和nvarchar来看,语法是

nvarchar [ ( n | max ) ]

|字符的装置,这些替代品。即可以指定 任何 n或文字max

如果选择指定一个特定值,n则该值必须在1到4,000之间,但使用时max将其定义为大对象数据类型(ntext不建议使用其替换)。

实际上,在SQL Server 2008中,对于一个 变量
,似乎可以无限地超过2GB的限制,前提是其中有足够的空间tempdb

关于您问题的其他部分

连接时的截断取决于数据类型。

  1. varchar(n) + varchar(n) 将截断为8,000个字符。
  2. nvarchar(n) + nvarchar(n) 将截断为4,000个字符。
  3. varchar(n) + nvarchar(n)将截断为4,000个字符。nvarchar具有较高的优先级,因此结果是nvarchar(4,000)
  4. [n]varchar(max)+[n]varchar(max)不会截断(<2GB)。
  5. varchar(max)+varchar(n)不会截断(<2GB),结果将键入为varchar(max)
  6. varchar(max)+nvarchar(n)不会截断(<2GB),结果将键入为nvarchar(max)
  7. nvarchar(max)+varchar(n)将首先将varchar(n)输入转换为nvarchar(n),然后进行串联。 如果varchar(n)字符串的长度 大于4,000个字符,强制转换将被nvarchar(4000)截断并发生

字符串文字的数据类型

如果使用N前缀和该字符串是<=长4,000个字符它将被分类nvarchar(n)其中n是串的长度。因此N'Foo'将被视为nvarchar(3)例如。如果字符串长度超过4,000个字符,则将被视为nvarchar(max)

如果不使用N前缀和字符串<= 8000个长字符将被分型为varchar(n)其中n是字符串的长度。如果更长varchar(max)

对于上述两种情况,如果字符串的长度为零,则将n其设置为1。

较新的语法元素。

1.CONCAT功能在这里无济于事

DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);

SELECT DATALENGTH(@A5000 + @A5000), 
       DATALENGTH(CONCAT(@A5000,@A5000));

对于两种串联方法,以上返回8000。

2. 注意+=

DECLARE @A VARCHAR(MAX) = '';

SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)

DECLARE @B VARCHAR(MAX) = '';

SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)


SELECT DATALENGTH(@A), 
       DATALENGTH(@B);`

退货

-------------------- --------------------
8000                 10000

注意@A遇到截断。

如何解决您遇到的问题。

由于将两个非max数据类型连接在一起,或者将varchar(4001 - 8000)字符串连接到nvarchar类型化的字符串(甚至是nvarchar(max)),您将被截断。

为了避免第二个问题,只需确保所有字符串文字(或至少长度在4001-8000范围内的字符串文字)都以开头N

为避免出现第一个问题,请从

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;

DECLARE @SQL NVARCHAR(MAX) = ''; 
SET @SQL = @SQL + N'Foo' + N'Bar'

以便NVARCHAR(MAX)从一开始就将an包含在串联中(因为每个串联的结果也将是NVARCHAR(MAX)这种传播)

查看时避免截断

确保已选择“结果网格化”模式,然后可以使用

select @SQL as [processing-instruction(x)] FOR XML PATH聽

SSMS选项允许您设置XML结果的无限长度。该processing-instruction位避免出现字符(例如<显示为)的问题&lt;



 类似资料:
  • 总之,我有一个大型(不可避免的)动态SQL查询。由于选择条件中的字段数量,包含动态SQL的字符串增加了4000个字符。现在,我了解到的最大值设置为4000,但是查看在服务器探查器中执行的SQL语句 似乎有效(!?),对于另一个同样大的查询,它会抛出一个与4000限制(!?)相关的错误,它基本上会在4000个限制之后修剪所有SQL,并给我留下一个语法错误。尽管在探查器中出现了这一点,它还是完整地显示

  • 问题内容: 如果我在表中有一列具有类型字段,并且如果我尝试插入长度为16的数据,MySQL会提示错误 有谁知道为什么MySQL中的VARCHAR字段采用固定长度?另外,基于给定的大小,每个记录的VARCHAR字段会占用多少字节? 问题答案: 如果将一列设置为允许的最大字节数为15,则在不修改该列以使其支持超过15个字符的情况下,最多不能传递15个字符。如果存储4个字符串,则只能使用约4个字节可能的

  • 问题内容: 根据定义: VARCHAR:长度范围是1到255个字符。除非指定BINARY关键字,否则以不区分大小写的方式对VARCHAR值进行排序和比较。x + 1个字节 TINYBLOB,TINYTEXT:BLOB或TEXT列,最大长度为255(2 ^ 8-1)个字符x + 1个字节 因此,基于此,我创建了下表: 还是创建varchar或tinytext更好, 为什么 ? 是否相同: VARCH

  • 本文向大家介绍char和varchar的区别?相关面试题,主要包含被问及char和varchar的区别?时的应答技巧和注意事项,需要的朋友参考一下 char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。

  • 问题内容: 是否可以将SQL Server 2008数据库中的列类型从更改为,而不必删除表并重新创建? 每当我尝试使用SQL Server Management Studio进行操作时,SQL Server Management Studio都会向我抛出一个错误-但是让我头疼的是,很高兴知道我是否可以更改类型而不必删除和创建。 谢谢 问题答案: 您应该能够使用TSQL做到这一点。 就像是

  • 问题内容: 在MySQL中,如果我在UTF-8表中创建一个新字段,是否意味着我可以在该字段中存储32个字节的数据或32个字符(多字节)? 问题答案: 这个答案出现在我的Google搜索结果的顶部,但不正确,所以: 混乱可能是由于测试了不同版本的mysql。 版本4计数字节 版本5包含字符 http://dev.mysql.com/doc/refman/5.0/zh-CN/string-type-