在SQL Server中char(n)和varchar(n)都是我们常用的字段,但是这两种类型的字段还是有着一些重要的区别的:
1.char(n)类型中的n是固定长度,也就是说不管往这个字段里插入什么内容,但是长度是固定的,不会有变化,多余的部分以空格展现出来。
2.varchar(n)类型中的n不是固定长度,可以根据实际输入的内容来展现长度,最大不超过n个字符。varchar类型的资料只会占用实际存儲的字符数量加上一点额外的存储空间來纪录长度信息。
3.如果長度固定的話,char字段上的索引效率级要比varchar高。
例子:
TEST表有以下字段,分别有char和varchar类型
往里面插入一条数据:
然后接下来把char类型和varchar类型的字段拿出来作对比:
keyId:char(10)
实际占用长度:“2407190001”
File:char(20)
实际占用长度:“test ” (红色部分为多余的,以空格形式补齐)
Production:varchar(50)
实际占用长度:“ANTA”
发现不同的地方了吗?当我们使用char(n)类型的时候,如果输入的内容长度没有实际的累心长度长,那么后面还是会以空格的形式补齐。而varchar(n)类型则是输入内容有多长,展示就有多长,不会出现空格。
分別在什么情況下使用char和varchar合适呢?
适合char类型的情況:
1.固定长度。
2.update数据频繁的场景。
例如:本文举例的“keyId”字段,长度固定为YYMMDDXXXX,后面四位为流水号,并且是主鍵。
适合varchar类型的情況:
1.长度不固定。
2.多语言支持。
例如:本文举例的“Production”字段,因为是生产的商品名称,但是不是所有的名称长度都一致,所以使用varchar较为合适。
需要注意的是我们在存储过程、视图或者函数中模糊查询使用char类型作为参数的时候,需要核对参数的长度是否和原字段的长度一致,如果不一致需要去掉空格,不然的话是查询不到数据的。
例如:
1.参数长度和字段长度一致:
DECLARE @File CHAR(20)
SET @File=(SELECT [File] FROM dbo.TEST WHERE keyId='2407190001')
SELECT * FROM dbo.TEST WHERE [File] LIKE '%' + @File + '%'
结果:能够查询出对应的数据。
2.参数长度和字段长度不一致:
DECLARE @File CHAR(30)
SET @File=(SELECT [File] FROM dbo.TEST WHERE keyId='2407190001')
SELECT * FROM dbo.TEST WHERE [File] LIKE '%' + @File + '%'
结果:查询不到数据。
需要去掉空格才能查询数据:
DECLARE @File CHAR(30)
SET @File=(SELECT [File] FROM dbo.TEST WHERE keyId='2407190001')
SELECT * FROM dbo.TEST WHERE [File] LIKE '%' + RTRIM(@File) + '%'
结果:
以上为本文的内容。