关于 varchar max的误区

前言


在论坛或者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亿,如果发现了不能存放可以先看看到底是那种原因引起的.

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值