MySQL中各数据类型长度相关计算过程及

时间:2024-11-13 08:40:31

整数类型

 

- TINYINT:

- 长度计算:1字节 = 8位。

- 取值范围计算(有符号):使用2的补码表示法,最高位为符号位(0表示正数,1表示负数),剩下7位表示数值。所以取值范围是 - 2^(7)到2^(7) - 1,即 - 128到127。

- 取值范围计算(无符号):8位都用来表示数值,所以取值范围是0到2^(8) - 1,即0到255。

- SMALLINT:

- 长度计算:2字节 = 16位。

- 取值范围计算(有符号):最高位为符号位,剩下15位表示数值。取值范围是 - 2^(15)到2^(15) - 1,即 - 32768到32767。

- 取值范围计算(无符号):16位都用于表示数值,取值范围是0到2^(16) - 1,即0到65535。

- MEDIUMINT:

- 长度计算:3字节 = 24位。

- 取值范围计算(有符号):最高位是符号位,其余23位表示数值。取值范围是 - 2^(23)到2^(23) - 1,即 - 8388608到8388607。

- 取值范围计算(无符号):24位全用来表示数值,取值范围是0到2^(24) - 1,即0到16777215。

- INT/INTEGER:

- 长度计算:4字节 = 32位。

- 取值范围计算(有符号):最高位为符号位,余下31位表示数值。取值范围是 - 2^(31)到2^(31) - 1,即 - 2147483648到2147483647。

- 取值范围计算(无符号):32位都用于表示数值,取值范围是0到2^(32) - 1,即0到4294967295。

- BIGINT:

- 长度计算:8字节 = 64位。

- 取值范围计算(有符号):最高位是符号位,其余63位表示数值。取值范围是 - 2^(63)到2^(63) - 1,即 - 9223372036854775808到9223372036854775807。

- 取值范围计算(无符号):64位全用来表示数值,取值范围是0到2^(64) - 1,即0到18446744073709551615。

 

浮点数类型

 

- FLOAT:

- 长度计算:4字节。

- 精度计算:在MySQL中,FLOAT默认精度下大致能精确到7位有效数字。这是基于IEEE 754标准的单精度浮点数格式,它使用32位来表示一个浮点数,其中包括1位符号位、8位指数位和23位尾数位。通过这些位的组合来实现对浮点数的近似表示,从而确定了大致能精确到的有效数字位数。

- DOUBLE:

- 长度计算:8字节。

- 精度计算:基于IEEE 754标准的双精度浮点数格式,使用64位来表示一个浮点数,其中有1位符号位、11位指数位和53位尾数位。通过这样的位组合,在默认精度下大致能精确到15位有效数字。

 

定点数类型

 

- DECIMAL(或NUMERIC):

- 以DECIMAL(5,2)为例:

- 总长度计算:根据精度(M,D)确定,M是总位数,D是小数位数。这里M = 5,D = 2,所以总长度是固定的5位数字(包括小数点)。

- 取值范围计算:因为总位数是5,小数位数是2,所以整数部分最多有3位。取值范围从 - 999.99到999.99。

 

字符类型

 

- CHAR:

- 以CHAR(10)为例:

- 长度计算:固定长度为指定的字符数,这里是10个字符。不管实际存储的字符长度是否达到10,都会占用10个字符的空间来存储数据,不足部分用空格填充。

- VARCHAR:

- 以VARCHAR(255)为例:

- 长度计算:实际存储长度取决于存储的字符数量,还会有1 - 3个字节用于记录长度信息。假设存储了一个长度为50个字符的字符串,那么实际占用空间就是50个字符的长度(假设一个字符占1字节)加上记录长度的字节数(假设为2字节),总共就是52字节。

 

二进制类型

 

- BINARY:

- 以BINARY(10)为例:

- 长度计算:固定长度为指定的字节数,这里是10字节。不足则填充0x00。

- VARBINARY:

- 以VARBINARY(255)为例:

- 长度计算:实际存储长度取决于存储的二进制数据的字节数,同样会有1 - 3个字节用于记录长度信息。假设存储了一个长度为50字节的二进制数据,那么实际占用空间就是50字节加上记录长度的字节数(假设为2字节),总共就是52字节。

 

日期时间类型

 

- DATE:

- 长度计算:占用3字节。

- 格式为'YYYY - MM - DD',范围是'1000 - 01 - 01'到'9999 - 12 - 31',这是MySQL规定的日期存储范围,通过内部的日期存储机制来实现对该范围内日期的准确存储。

- TIME:

- 长度计算:占用3字节。

- 格式是'HH:MM:SS',可以表示范围从'- 838:59:59'到'838:59:59',基于MySQL的时间存储机制来实现对该范围内时间的存储。

- DATETIME:

- 长度计算:占8字节。

- 格式为'YYYY - MM - DD HH:MM:SS',范围从'1000 - 01 - 01 00:00:00'到'9999 - 12 - 31 23:59:59',通过其内部的日期时间存储机制来实现对该范围内日期和时间的准确存储。

- TIMESTAMP:

- 占4字节。

- 格式为'YYYY - MM - DD HH:MM:SS',范围是'1970 - 01 - 01 00:00:00'到'2038 - 01 - 19 03:14:07'(在32位系统下),其存储机制与服务器的时区设置相关,会根据时区自动转换值,并且由于存储格式的限制,其范围相对较窄。