sql server节俭的艺术

SQL Server
302
0
0
2022-04-14

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 用于定义字符串长度,并且它必须为 18,000 之间的值。 存储大小为 n 字节。 char 的 ISO 同义词为 character

varchar [ ( n | max ) ]

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

text

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

Unicode 字符串

nchar [ ( n ) ]

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

nvarchar [ ( n | max ) ]

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

ntext

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

二进制字符串

binary [ ( n ) ]

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

varbinary [ ( n | max) ]

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

图像

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

NULL值是否占用存储空间

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

  • 例如:

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

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

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

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