有你在真好 的个人博客
sql server节俭的艺术
阅读:2263 添加日期:2021/3/27 23:20:33 原文链接:https://www.toutiao.com/item/6710099069949182476/
sql server节俭的艺术

显式和隐式数据类型转换

当数据库记录数较大的时候,我们必须考虑字段类型是否合适,它对数据库读写性能、存储空间有较大影响。

例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上,所以没必要用int,后者会占用更大的存储空间,并对读写产生影响。

以下是我对sql server数据类型的总结,包括数据类型范围、存储,最后也对NULL值是否会占存储空间做一些说明。

精确数字

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 字节

decimal 和 numeric

精度	存储字节数
1 - 9	 5
10-19	9
20-28	13
29-38	17

money

-922,337,203,685,477.5808 到 922,337,203,685,477.5807	8 字节

smallmoney

-214,748.3648 到 214,748.3647	4 个字节

近似数字

float

-1.79E + 308 至 -2.23E - 308、0 以及 2.23E - 308 至 1.79E + 308	取决于 n 的值
n 值	精度	存储大小
1-24	7 位数	4 个字节
25-53	15 位数	8 字节

real

-3.40E + 38 至 -1.18E - 38、0 以及 1.18E - 38 至 3.40E + 38	4 个字节

日期和时间

date 固定 3 个字节

datetime 8 字节

smalldatetime 固定 4 个字节。

time

固定 5 个字节,是使用默认的 100ns 秒的小数部分精度时的默认存储大小。 在 Informatica 中,默认为 4 个字节,固定不变,同时秒的小数部分精度默认为 1 毫秒。

datetime2

精度小于 3 的 6 个字节。
精度为 3 和 4 的 6 个字节。
所有其他精度则需要 8 个字节。1

datetimeoffset

指定的小数位数	结果 (精度, 小数位数)	列长度(以字节为单位)	秒的小数部分精度
datetimeoffset		(34,7)	10	7
datetimeoffset(0)	(26,0)	8	0-2
datetimeoffset(1)	(28,1)	8	0-2
datetimeoffset(2)	(29,2)	8	0-2
datetimeoffset(3)	(30,3)	9	3-4
datetimeoffset(4)	(31,4)	9	3-4
datetimeoffset(5)	(32,5)	10	5-7
datetimeoffset(6)	(33,6)	10	5-7
datetimeoffset(7)	(34,7)	10	5-7

字符串

char [ ( n ) ]

固定长度,非 Unicode 字符串数据。 n 用于定义字符串长度,并且它必须为 1 到 8,000 之间的值。 存储大小为 n 字节。 char 的 ISO 同义词为 character。

varchar [ ( n | max ) ]

可变长度,非 Unicode 字符串数据。 n 用于定义字符串长度,并且它可以为 1 到 8,000 之间的值。 max 指示最大存储大小是 2^31-1 个字节 (2 GB)。 存储大小为所输入数据的实际长度 + 2 个字节。 varchar 的 ISO 同义词为 char varying 或 character varying。

text

服务器代码页中长度可变的非 Unicode 数据,字符串最大长度为 2^31-1 (2,147,483,647) 个字节。 当服务器代码页使用双字节字符时,存储仍是 2,147,483,647 字节。 根据字符串,存储大小可能小于 2,147,483,647 字节。

Unicode 字符串

nchar [ ( n ) ]

固定长度字符串数据。 n 用于定义字符串长度(以双字节为单位),并且它必须为 1 到 4,000 之间的值。 存储大小为 n 字节的两倍。 对于 UCS-2 编码,存储大小为 n 个字节的两倍,并且可存储的字符数也为 n。 对于 UTF-16 编码,存储大小仍为 n 个字节的两倍,但可存储的字符数可能小于 n,因为补充字符使用两个双字节(也称为代理项对)。 nchar 的 ISO 同义词是 national char 和 national character。

nvarchar [ ( n | max ) ]

可变长度字符串数据。 n 用于定义字符串长度(以双字节为单位),并且它可以是 1 到 4,000 之间的值。 max 指示最大存储大小是 2^30-1 个字符 (2 GB)。 存储大小为 n 字节的两倍 + 2 个字节。 对于 UCS-2 编码,存储大小为 n 个字节的两倍 + 2 个字节,并且可存储的字符数也为 n。 对于 UTF-16 编码,存储大小仍为 n 个字节的两倍 + 2 个字节,但可存储的字符数可能小于 n,因为补充字符使用两个双字节(也称为代理项对)。 nvarchar 的 ISO 同义词是 national char varying 和 national character varying。

ntext

长度可变的 Unicode 数据,字符串最大长度为 2^30 - 1 (1,073,741,823) 个字节。 存储大小是所输入字符串长度的两倍(以字节为单位)。 ntext 的 ISO 同义词为 national text。

二进制字符串

binary [ ( n ) ]

长度为 n 字节的固定长度二进制数据,其中 n 是从 1 到 8,000 的值。 存储大小为 n 字节。

varbinary [ ( n | max) ]

可变长度二进制数据。 n 的取值范围为 1 至 8,000。 max 指示最大存储大小是 2^31-1 个字节。 存储大小为所输入数据的实际长度 + 2 个字节。 所输入数据的长度可以是 0 字节。 varbinary 的 ANSI SQL 同义词为 binary varying。

图像

长度可变的二进制数据,从 0 到 2^31-1 (2,147,483,647) 个字节。

NULL值是否占用存储空间

在SQL SERVER中,定长记录的NULL值占用存储空间,而变长记录的NULL值不占用存储空间。

  • 例如:

对于varchar数据类型,无论是空字符串还是NULL值都不占用任何空间

对于char数据类型,无论是空字符串还是NULL值都占用空间,所占用空间大小取决于建表时候指定的char数据类型的大小

参考一下链接验证上述结论

https://blog.csdn.net/h2503652646/article/details/84991240

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号