sql server常用数据类型区别

本文主要介绍了SQL Server中常见的数据类型,包括bigint、int、date、datetime2、char、nchar、varchar、nvarchar、float、real和decimal的区别和使用场景。详细阐述了各种类型的特点,如bigint与int的提升规则,date、datetime、datetime2和dateTimeOffset的精度和存储大小,以及char与nchar的Unicode支持,float与decimal的精度差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的数据类型使用时总是分不清,记个笔记方便以后查阅。

- bigint,int,smallint,tinyint

数据类型范围存储
bigint-2^63 (-9,223,372,036,854,775,808) ~ 2^63-1 (9,223,372,036,854,775,807)8字节
int-2^31 (-2,147,483,648) ~ 2^31-1 (2,147,483,647)4字节
smallint-2^15 (-32,768) ~ 2^15-1 (32,767)2字节
tinyint0~ 2551字节

在数据类型优先次序表中,bigint 介于 smallmoney 和 int 之间。
只有当参数表达式为 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自动将其他整数数据类型(tinyint、smallint 和 int)提升为 bigint。

- date,time,datetime ,datetime2,dateTimeOffset

数据类型默认格式范围存储
dateyyyy-MM-dd0001-01-01 ~ 9999-12-313字节
timehh:mm:ss.nnnnnnn/5字节
datetimeyyyy-MM-dd hh:mm:ss.nnn1753-01-01 00:00:00.000 ~ 9999-12-31 23:59:59.9978字节
datetime2yyyy-MM-dd hh:mm:ss.nnnnnnn/可变
dateTimeOffsetYYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm]表示的日期范围是:0001-01-01 到 9999-12-31
表示的时间范围是:00:00:00 到 23:59:59.9999999
表示的时间精度是100ns
表示的时区范围是:-14:00 到 +14:00
可变

Date表示一个日子,不包含时间部分。
DateTime包含日期和时间部分,精确到3.33毫秒(0.00333秒)。
DateTime2可以表示比DateTime更精确的时间,默认的数据格式是yyyy-MM-dd hh:mm:ss.nnnnnnn,DateTime2 秒默认的精度是7,即用7位小数表示一秒的精度。
其存储大小(Storage Size)不固定,DateTime2(n)占用的存储空间和小数秒的精度之间的关系是:

  • 当小数秒的精度 n < 3 时,存储空间是6B;

  • 当小数秒的精度 n 是 3 - 4 时,存储空间是7B;

  • 当小数秒的精度 n 是 5 - 7 时,存储空间是8B,最大的小数秒精度是7,默认值是7;

DateTimeOffset小数秒的默认精度是7,小数秒的精度会影响变量占用的存储空间的大小:

  • 当小数秒的精度n是 0-2 时,存储大小是8B

  • 当小数秒的精度n是 3-4 时,存储大小是9B

  • 当小数秒的精度n是 5-7 时,存储大小是10B

datetime占用的存储空间太大,精度不高,datetime2完胜datetime,在产品环境中,推荐使用datetime2,如果对time的要求不是很高,保留2位毫秒,使用datetime2(2),比其他类型节省存储空间。

- char(n),nchar(n),varchar(n),nvarchar(n)

数据类型默认格式字符集n
char(n)固定长度ANSI字符,不足的补英文半角空格0 ~ 8000
nchar(n)固定长度Unicode字符,不足的补英文半角空格0 ~ 4000
varchar(n)可变长度ANSI字符,根据数据长度自动变化0 ~ 8000
nvarchar(n)可变长度Unicode字符,根据数据长度自动变化0 ~ 4000

ANSI主要是以单字节来存储数据,一般适合英文。而我们常用的汉字需要用两个字节来存储,所以就要使用unicode的数据类型,不然读取出来的数据可能会乱码。

- float,real,decimal

float 表示近似数值,存在精度损失,数据类型是 float(n)。

n精度存储
1~2474
25-53158

如果1 <= n <= 24,则将n视为24;如果25 <= n <= 53,则将n视为53
近似数值很难确定是否相等,因此,应避免对 float 类型做相等比较,而只限于比较 > 或 < 。

real也表示近似数值,可直接用float表示:real=float(24)。

decimal表示精确数值,不存在精度损失,数据类型decimal(p,s) 需要分别指定小数的最大位数§和小数位的数量(s)。

  • p (precision) :指定小数的最大位数,小数点的左侧和右侧的数字的总数量不能超过p,p的取值范围是从1到38,默认值为18。
  • s (scale):指定在小数点右侧的小数位数,p-s是小数点左边的最大位数。s必须是从0到p的值,只有在指定了精度的情况下才能指定s,s的默认值是0,因此,0 <= s <= p。
精度 (precision)存储
1~95字节
10~199字节
20~2813字节
29~3817字节

p 和 s 必须遵守规则:0 <= s <= p <= 38,decimal(p,s) 能够表示的有效值是从 - 10^38 +1 到 10^38 - 1。

decimal 数据类型的最大精度为 38,这意味着,decimal 数据类型最多可以存储 38位数字,所有这些数字均可位于小数点后面。decimal 数据类型存储精确的数字表示形式,没有近似值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值