博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【SQL】小心字符串拼接导致长度爆表
阅读量:4655 次
发布时间:2019-06-09

本文共 1123 字,大约阅读时间需要 3 分钟。

原文:

请看代码:

DECLARE @max VARCHAR(max)SET @max='aaa...' --这里有8000个a         +'bb' --连接一个varchar常量或变量SELECT LEN(@max)

别想当然以为它会返回8002,而是8000,select @max也只会得到8000个a,后面两个b没了。我们知道,varchar(max)类型不受字符数限制,但为什么会这样?

这其实与@max的数据类型无关,而是与字符串拼接后得到的数据类型有关,或者说,与字符串常量的数据类型推断有关。在SQL 2005和SQL 2008(R2)中,敲一个'a',系统会把它作为varchar(1),'aa'则是varchar(2),N'a'则是nvarchar(1),而'a...'(超过8000个a)呢,05中会当它是text,08则当它是varchar(max),常量或变量的数据类型可以通过系统函数SQL_VARIANT_PROPERTY获取,使用示例:

SELECT SQL_VARIANT_PROPERTY('a','BaseType')

有关该函数的更多信息请参看SSMS帮助或

那么问题来了,既然超过8000个字符的常量系统会自动识别为大数据类型,不会出现截断,为什么拼接一下就歇菜了,这是因为varchar(n)+varchar(n)还是=varchar(n),拼接时系统会自动拓展数据长度,但不会更改数据类型(varchar(n)与varchar(max)应视为不同数据类型),又因为varchar(n)中的n最大取值为8000,所以varchar(x)+varchar(y)最大只会得到varchar(8000),当x+y>8000时,便会出现截断。

回到文章开头的例子,就很明了了,'aaa...'和'bb'都是varchar(n),拼接后得到varchar(8000),也就是截断了的8000个'aaa...',所以即便把它赋值给varchar(max)也无济于事。如果'aaa...'再多个a,情况又不同了,这时就是text或varchar(max)+varchar(n),对于05,会报text与varchar不能拼接,对于08,会正确得到无截断的'aaa...bb',因为varchar(max)+varchar(n)=varchar(max)。

OK就到这里,希望猿友在拼接SQL字串时留意这个问题。

posted on
2014-11-13 20:27 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4095793.html

你可能感兴趣的文章
tomcat项目的部署
查看>>
SQLServer2012通过链接服务器执行SQLServer2000的存储过程的问题
查看>>
C语言-06复杂数据类型-01数组
查看>>
查看Python、flask 版本
查看>>
同余方程 2012年NOIP全国联赛提高组
查看>>
vue 图片预览插件
查看>>
深入解析:分布式系统的事务处理经典问题及模型
查看>>
python的2种字符串格式化输出
查看>>
Netsharp快速入门(之14) 销售管理(报表A 热销滞销品统计)
查看>>
配置 SQL Server Email 发送以及 Job 的 Notification通知功能
查看>>
线上应用bug跟踪查找-友盟统计
查看>>
07 数据结构
查看>>
docker学习(一)
查看>>
django.db.migrations.exceptions.InconsistentMigrationHistory django报错
查看>>
linux shell编程指南第十八章------控制流结构
查看>>
iOS设备信息
查看>>
<每日一题>题目12:列表解析及zip、dict函数的简单应用
查看>>
h5点击区域和实际区域对不上
查看>>
ssh免秘钥登录
查看>>
Box2D的三种Body类型
查看>>