常用的数据类型使用时总是分不清,记个笔记方便以后查阅。
- 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字节 |
tinyint | 0~ 255 | 1字节 |
在数据类型优先次序表中,bigint 介于 smallmoney 和 int 之间。
只有当参数表达式为 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自动将其他整数数据类型(tinyint、smallint 和 int)提升为 bigint。
- date,time,datetime ,datetime2,dateTimeOffset
数据类型 | 默认格式 | 范围 | 存储 |
---|---|---|---|
date | yyyy-MM-dd | 0001-01-01 ~ 9999-12-31 | 3字节 |
time | hh:mm:ss.nnnnnnn | / | 5字节 |
datetime | yyyy-MM-dd hh:mm:ss.nnn | 1753-01-01 00:00:00.000 ~ 9999-12-31 23:59:59.997 | 8字节 |
datetime2 | yyyy-MM-dd hh:mm:ss.nnnnnnn | / | 可变 |
dateTimeOffset | YYYY-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~24 | 7 | 4 |
25-53 | 15 | 8 |
如果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~9 | 5字节 |
10~19 | 9字节 |
20~28 | 13字节 |
29~38 | 17字节 |
p 和 s 必须遵守规则:0 <= s <= p <= 38,decimal(p,s) 能够表示的有效值是从 - 10^38 +1 到 10^38 - 1。
decimal 数据类型的最大精度为 38,这意味着,decimal 数据类型最多可以存储 38位数字,所有这些数字均可位于小数点后面。decimal 数据类型存储精确的数字表示形式,没有近似值。