失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MySQL 数据类型及占用空间

MySQL 数据类型及占用空间

时间:2021-02-03 09:25:56

相关推荐

MySQL 数据类型及占用空间

MySQL 数据类型

元数据

VARCHAR类型字符串及DECIMAL的占用空间实际上包含2部分,一是存储数据本身占用的空间,二是描述数据的元数据占用的空间,例如VARCHAR类型会使用1个字节记录存入数据实际的字符数。

最大行大小限制

MySQL表的内部表示具有65,535字节的最大行大小限制,即使存储引擎能够支持更大的行也是如此。BLOBTEXT列只使用行大小9到12个字节,因为它们的内容与行的其余部分分开存储。

字符集为utf8mb4时,每个字符占4个字节,VARCHAR字段最大可创建的长度为65535/4=16383,超出则会提示Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

整型

常用的整数数据类型有tinyintsmallintmediumintintbigint共计5种。在声明列时,后面也可以跟上n,例如int(n)。它的含义是“显示位宽”,这个n无论填任何数,不影响存储空间,仅影响在检索时的输出格式,而且在非常严格的情况下才成立。

在声明列的时候,要使用到该特性,必须加上zerofill(填充0)属性,即语句为

`id` int(20) unsigned zerofill DEFAULT NULL

zerofill必须同时加unsigned

“无用”的显示位宽特性:

对存储环节没有任何帮助,仅改变输出显示环节。

int(20) unsigned也只能存储4个字节(0~2^32),不会达到bigint(20)所使用的8个字节存储空间格式化方式仅仅只有“补0”一种方式。

当插入的数字小于显示位宽配置时,在特定客户端检索输出时,会在数字前“补0”,凑足数字仅针对特定客户端输出时才有显示效果,目前仅发现使用MySQL Shell才有显示效果,其他客户端连接时均无。

占用空间

整型的占用空间是固定的,均与其后设置的n无关,例如设置字段类型为int,则无论n设置什么,它占用的空间就是4个字节。

当插入的值,超出取值范围的时候,MySQL并不会报错,而是自动变成成在取值范围内最接近该值的边界值。例如字段为 tinyint ,有符号型时取值范围 -128至127 ,当你输入-222时,不会报错,会自动存入最接近-222的-128,当你输入222时,会自动存入127。

浮点型

FLOAT类型固定占用4个字节,DOUBLE类型固定占用8个字节,逻辑和上述的整型类似,不再赘述。

下面我们来说说DECIMAL类型,它的定义方式是DECIMAL(M,D),其中M表示最大位数,D表示小数点右侧的位数。对于DECIMAL(M,D)来说,M-D的值为小数点前的位数,D的值为小数点后的位数,要算取值范围则各个位置填充9,取正负范围。

这里的“位”不是二进制的比特位,而是指十进制的数字的位数。

例如我们定义DECIMAL(5,2),则表示最大位数为5位,小数点后2位,因此小数点前还剩下3位,于是取值范围为-999.99至999.99

占用空间

DECIMAL(M,D)的存储方式和其他数字类型都完全不同,它是以字符串形式进行存储

1个数字字符占用1个字节,因此定义为DECIMAL(M,D)占用 M 个字节。

DECIMAL类型在存储时有补0操作。小数点前不足,向更高位补0,小数点后不足,向更低位补0。

以DECIMAL(5,2)为例,如果准备存入9.5,实际存入 ‘009.50’ ,转化为十六进制为30 30 39 2E 35 30

字符串类型

CHAR(n)VARCHAR(n)两者中的n含义均为该字段最大可容纳的字符数

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)

5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

CHAR_LENGTH()函数返回字符串的字符数,LENGTH()函数返回字符串的字节数

CHAR

CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。

对于CHAR字段,在使用CHAR_LENGTH()LENGTH()函数查询时,输出时自动省略右侧空格

insert into `tmp`(`nick`) values ('为s ');---查询select nick,char_length(nick),length(nick) from `tmp` where id = 1;---nick=>'为s',CHAR_LENGTH(nick)=>2,LENGTH(nick)=>4

VARCHAR

VARCHAR(M) 定义时,必须指定长度M,否则报错。检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节

编码字符字节参考表

utf8mb4兼容utf8,存储补充字符(如emoji)时需要4个字节

参考资料:

MySQL 数据类型中长度的含义MySQL varchar字符长度的计算

如果觉得《MySQL 数据类型及占用空间》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。