SQL中Char类型变量与字符串拼接异常问题求助
为啥CHAR类型变量拼字符串会出这种幺蛾子?
哈哈,这个坑我之前也踩过!核心原因就是CHAR类型的“固定长度+自动补空格”特性,再加上SQL Server赋值时的截断规则在搞鬼:
CHAR变量的隐形空格:你声明了
char(10)的变量,赋值546875.5——这个值其实只有8个字符对吧?SQL Server会自动给它补俩空格凑够10位,所以变量里实际存的是'546875.5 '(后面俩空格是看不见的,但真实存在)。拼接后被截断了:
- 当你执行
@Var + '100',拼接出来的结果是'546875.5 100',总长度13位。但你把这个结果赋值回char(10)的变量时,SQL Server会直接砍掉超出10位的部分,只留前10位——也就是原来的'546875.5 ',所以看起来跟没拼接一样。 - 哪怕你改成
char(100),初始赋值后变量末尾会补92个空格,拼接'100'后总长度103位,赋值回char(100)还是会截断到100位,前100位就是原来的值加一堆空格,自然输出还是老样子。
- 当你执行
反转顺序为啥能成?
当你反过来拼'100' + @Var,结果是'100546875.5 '(13位),赋值回char(10)变量时,截断前10位就是'100546875.'——这时候你能看到100已经粘在前面了,所以感觉“成功拼接”了。
怎么解决?
给你几个实用的办法:
换用VARCHAR类型:这是最省心的!VARCHAR是可变长度,不会自动补空格,只要长度够,拼接后啥都不会丢:
declare @Var varchar(100) = '546875.5' set @Var = @Var + '100' select @Var -- 输出 '546875.5100'先去掉CHAR变量的尾巴空格:用
RTRIM()函数把CHAR变量末尾的空格干掉再拼,这样就不会浪费长度了:declare @Var char(13) = '546875.5' -- 这里把长度调够拼接后的13位 set @Var = RTRIM(@Var) + '100' select @Var -- 输出 '546875.5100'提醒下:要是变量长度还是不够,拼接后还是会被截断,所以要么调长度,要么直接换VARCHAR。
直接查拼接结果,别赋值回原变量:要是你只是想看看拼接后的内容,不用赋值回去,直接查就行:
declare @Var char(10) = '546875.5' select @Var + '100' -- 输出 '546875.5 100'
内容的提问来源于stack exchange,提问作者Piyush Bhardwaj
相关产品推荐
相关产品推荐

