关于 varchar max的误区

 更新时间:2019年3月15日 08:14  点击:563

我们知道varchar(max)是微软用来替代text数据类型的,后续的版本text 等老的字段类型可能会被取消。

所以text能存的,varchar(max)肯定能存下。 其实它能够存放的字符数是非常大的。


varchar(max)可以存放2^31-1个字节


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


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


字符串被截断

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


解决办法1:

使用强制转换

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 也可以看到完整的记录

盲目的把数据复制了出来,发现数据是截断的,结果以为是这个导致了问题,如果数据超过了8000个字符,右键复制数据,复制出来的其实是不完整的数据,其实数据存入数据库的数据是完整的


    可以通过PRING(len(字段))来查看长度或者LEFT和RIGHT来看末尾和前端数值

SELECT     [列名] AS 正常,
        RIGHT([列名],3) AS 右边3位,
        LEFT([列名],3) AS 左边3位
        FROM 表名


    导致这个原因就是复制数据的时候是有长度限制的,最高就是8000个字符

[!--infotagslink--]

相关文章

  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • C#查询SqlServer数据库并返回单个值的方法

    这篇文章主要介绍了C#查询SqlServer数据库并返回单个值的方法,涉及C#操作SQLServer数据库查询的相关技巧,需要的朋友可以参考下...2020-06-25
  • SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息

    SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。 [SQLSTATE 42000] (ConnIsLoginSysAdmin)...2021-07-15
  • SQL SERVER迁移之更换磁盘文件夹的完整步骤

    这篇文章主要给大家介绍了关于SQL SERVER迁移之更换磁盘文件夹的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • SqlServer 数据库 三大  范式

    本文将基于三大范式原则,结合具体的实例做简要分析,对SqlServer 数据库 三大 范式相关知识感兴趣的朋友一起看看吧...2020-07-11
  • sql server日志处理不当造成的隐患详解

    这篇文章主要给大家介绍了关于sql server日志处理不当造成的隐患的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
  • PHP在Linux下连接MSSQLServer的配置方法简述(一、Sybase库)

    如果需要在Linux下访问Microsoft SQL Server或Sybase数据库,则推荐下列软件包。 SybaseCommon http://download.sybase.com/pub/ase1192_linux/sybase-common-11.9....2016-11-25
  • sqlserver添加sa用户和密码的实现

    这篇文章主要介绍了sqlserver添加sa用户和密码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07
  • CentOS8安装SQLServer2019的过程

    这篇文章主要介绍了CentOS8安装SQLServer2019的步骤,本文通过命令实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • c#操作sqlserver数据库的简单示例

    这篇文章主要介绍了c#操作sqlserver数据库的简单示例,需要的朋友可以参考下...2020-06-25
  • C# 启动 SQL Server 服务的实例

    下面小编就为大家分享一篇C# 启动 SQL Server 服务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • c#实现获取字符串阵列中元素最长或最短的长度

    下面小编就为大家分享一篇c#实现获取字符串阵列中元素最长或最短的长度方法,具有很好的参考价值,希望对大家有所帮助...2020-06-25
  • sql server数据库中raiserror函数用法的详细介绍

    这篇文章主要介绍了sql server数据库中raiserror函数用法的详细介绍,raiserror用于抛出一个异常或错误,让这个错误可以被程序捕捉到。对此感兴趣的可以了解一下...2020-12-08
  • WPF TextBox实现按字节长度限制输入功能

    这篇文章主要为大家详细介绍了WPF TextBox实现按字节长度限制输入功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • sqlserver 批量数据替换助手V1.0版发布

    前段时间网站被挂马,数据库表中很多文本字段都被加上了一段js脚本。修复完程序漏洞之后便开始着手清理这些被注入的数据,其间参考了一些网上的方法,大都是写一个存储过程进行一个表一个表逐一清理。...2021-09-22
  • c++读取sqlserver示例分享

    这篇文章主要介绍了c++读取sqlserver的示例,需要的朋友可以参考下...2020-04-25
  • SqlServer 表单查询问题及解决方法

    这篇文章主要介绍了SqlServer 表单查询问题及解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • sqlserver中distinct的用法(不重复的记录)

    distinct这个关键字用来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。...2020-07-11
  • sqlserver 普通用户运行错误解决方法补充

    本方法作为Windows2003服务器安装及设置教程——MSSQL安全篇一(将MS SQL SERVER运行于普通用户下)的补充,成功解决了不能将sqlserver运行在普通用户的权限下的问题。...2016-01-27