关于 varchar max的误区

原创 2017年08月25日 18:20:46

前言


在论坛或者qq群里都会遇到有人问,类似varchar(max)不够存字符串的长度怎么办?有的人会说改成text的数据类型。那真相是什么呢?

分析


首先,varchar(max)是微软用来替代text数据类型的,后续的版本text 等老的字段类型可能会被取消。所以text能存的,varchar( max)肯定能存下。 其实它能够存放的字符数是非常大的。下面粘上我以前博客上的一个截图:


可以存储的4.2亿 个字符 我相信很难达到的.所以当遇到 貌似“存不下”的情况,尽量多检查下其他的原因

解决


下面针对可能遇到的情况给出解决方案

字符串被截断

declare @test varchar(max)
set @test=replicate('1',9000)
print len(@test)

解决办法

使用强制转换
set @test=replicate(convert(varchar(max),'1'),9000)--强制转换为varchar(max)。
print len(@test)

解决办法2
把9000个字符拆分成2个部分,每个部分都少于8000
set @test=replicate(convert(varchar(max),'1'),4000)+replicate(convert(varchar(max),'1'),5000)
print len(@test)

这里还有一个坑,就是print @test
你把这个文本内容copy出来后发现字符只有8000个

这是因为, print是无法线上超过8000的长度,我们查看尽量用len 去查看


查看内容时数据少了

有时候只看len我们 心里肯定不踏实,还是想看看内容是否全部保存了


set @test=replicate(convert(varchar(max),'1'),99000)
select @test
对应select 的结果发现长度为43680

这是因为在SSMS 选项中,以网格显示结果对应非xml最多可以65535个字符。


那么我们就有另外的一个办法了

SELECT CAST('<A><![CDATA[' + CAST(@test as nvarchar(max)) + ']]></A>' as xml)
把上面的语句转换为xml文件,就可以显示99001了


或者
把select出来的结果 另存为CSV 也可以看到完整的记录



总结


varchar(max) 能存放的字符串是很长的,达到4.2亿,如果发现了不能存放可以先看看到底是那种原因引起的.

版权声明:本文为博主原创文章,未经博主允许不得转载。

varchar(max) 长度的验证

很久没有定下心来学习了,正好要用到数据库发邮件,正文内容长度不能确定,需要用到nvarchar(max),一开始凭经验应该觉得就是8000或4000。但网上查了结果,并做了一些测试后,才知道不是那...
  • greystar
  • greystar
  • 2014年12月01日 16:41
  • 3826

SQL Server中Text和varchar(max) 区别

以前只知道text和image是可能被SQL Server淘汰的数据类型,但具体原因不太清楚,今天读书的时候发现了text与varchar(max)和nvarchar(max)的区别,主要是对操作符的...
  • fox123871
  • fox123871
  • 2014年05月11日 23:58
  • 16383

SQL Server 2005 添加了nvarchar(max),varchar(max)

在SQL Server 2000的存储过程中,若使用下列语句会出错。@key 为int类型,@content为ntext类型,@ID为int类型Update Table1 set Key = @Key...
  • redleaf1995
  • redleaf1995
  • 2007年05月12日 00:50
  • 1636

varchar 与varchar(max)

declare @test table(    name varchar(100),    password varchar(max))insert into @test values(woaidad...
  • qqqwwwqw
  • qqqwwwqw
  • 2009年10月12日 20:56
  • 340

了解SQLServer中varchar(max)、nvarchar(max)和varbinary(max)

了解SQLServer中varchar(max)、nvarchar(max)和varbinary(max) 转载于:http://www.poorren.com/sqlserver-2005-v...
  • lingxyd_0
  • lingxyd_0
  • 2014年12月21日 08:47
  • 6542

SQL Server 2008 数据类型-varchar(MAX)、nvarchar(MAX) 到底有多大?

在 SQL Server 2000 中,varchar(8000)、nvarchar(8000) 就是极限了,在 SQL Server 2005、SQL Server 2008 中,增加了 varch...
  • dulgao
  • dulgao
  • 2016年08月11日 10:28
  • 2798

SQL Server中Text和varchar(max) 区别

SQL Server中Text和varchar(max) 区别 分类: MSSQL数据库 2014-05-11 23:58 245人阅读 评论(0) 收藏 举报 SQ...
  • u010796875
  • u010796875
  • 2014年09月28日 16:13
  • 498

oracle数据库中对varchar类型求max的解决方法

http://kidiaoer.iteye.com/blog/1064902 在oracle中,如果对varchar类型求max会发现9比10大,这是因为数据类型的原因,我们需要将varchar转换...
  • xw13106209
  • xw13106209
  • 2011年08月09日 12:38
  • 4457

SQL Server 2008 数据类型-varchar(MAX)、nvarchar(MAX)

SQL Server 2008 数据类型-varchar(MAX)、nvarchar(MAX) 到底有多大?在 SQL Server 2000 中,varchar(8000)、nvarchar(800...
  • liudayu_hikvision
  • liudayu_hikvision
  • 2010年12月31日 14:22
  • 18562

sql server 中nvarchar(max)性能

When you store data to a VARCHAR(N) column, the values are physically stored in the same way. But wh...
  • is2120
  • is2120
  • 2012年08月02日 17:17
  • 2852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于 varchar max的误区
举报原因:
原因补充:

(最多只允许输入30个字)