关于 varchar max的误区
2017-08-25 18:20
176 查看
前言
在论坛或者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亿,如果发现了不能存放可以先看看到底是那种原因引起的.相关文章推荐
- 关于autorelease一个认识的误区
- 关于hibernate中一对一和一对多的之中的误区整理
- 关于C标准库类型存储误区标注
- 关于学习误区的反思
- struts2中关于使用自定义的拦截器后,从页面提交过来的bean的参数的值为null的误区及解决
- 关于对象和引用的误区。
- 写给Linux内核新手-关于Linux内核学习的误区
- 关于setbkcolor()的误区~
- 安全普及:关于网络远程控制和木马的几点误区
- 写给Linux内核新手-关于Linux内核学习的误区
- 写给Linux内核新手-关于Linux内核学习的误区
- 关于新技术的常见认知误区
- 关于性能比较的应用误区
- 关于字节序的理解误区
- 关于ESB常见认识误区
- 一个误区(关于javascript的字符串拼接)
- 关于字符串后面加'\0'的误区[str[i]='\0';]——基于谭浩强答案链接两个字符串,不使用strcat函数之例
- 关于winform中ListView的几个误区 item和subitem
- 关于测试用例设计的五大误区...
- 解析关于HTML5的认知误区及其未来潜力