最近在学习MySQL,对MySQL数据类型做了些查阅资料,以下对最近的查阅情况进行总结~
字符串类型
char和varchar
char(n)
是固定长度,最多255个字符;varchar(n)
是可变长度,最多65535个字符。- 在存储大小上,
char(n)
存储n个字节大小,如果字符串长度小于n,则后面用空格补齐,因此如果字符串后面有空格,用char
类型存放是无效的;varchar
则是实际字符串的长度+1/2个字节(如果n<=255,则加1个字节;如果n>255,则加2个字节)。 - 在查询速度上,
char
速度比varchar
快。
浮点型和定点型
- 浮点型包括有float和double,如
float(m,d)
和double(m,d)
,其中m代表总个数,d代表小数位;定点型有decimal,如`decimal(m,d) ,其中,m是总个数,d是小数位。 - 浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
float
是8位精度(4字节);double
是16位精度(8字节)。
数据类型附属的数字n
TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT
这几个都是定长的数据类型,以Int为例。
Int类型属于定长类型,大小为4个字节,有符号存储范围为-2147483648~2147483647。
Int(n)
中的n表示的是其显示长度,不影响其存储空间大小。
所以,TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT后面附属的n表示其显示长度,不影响存储空间大小。
float(m,n),decimal(m,n)
float(m,n)
是属于变长类型,decimal(m,n)
属于定长类型,其中m代表总的个数,n代表小数位的精确位数。因此在存储的时候,先判断小数位进行“对齐”,即“多删少补”,多删的规则是四舍五入,少补就是后面补0。然后对整数位进行判断是否越界,如果越界,根据不同的模式有不同的处理,严格模式则提示error: out of range
,非严格模式则存储为上界数。
char(n),varchar(n)
char(n)
和varchar(n)
的n都是用来限制存储长度,如果存入的字符串长度超过n,则报错。
比如在tc
表中创建属性为char(4)
何varchar(4)
的字段,然后分别insert长度为5的字符串则会报错。
decimal占用字节数计算方法
小数和整数分别计算,每9位数占4字节,剩余部分如下表换算:
位数 | 占用字节数 |
---|---|
0 | 0 |
1-2 | 1 |
3-4 | 2 |
5-6 | 3 |
7-9 | 4 |
举几个例子:
比如decimal(18,9)
,整数部分和小数部分各9位,所以各占4字节,共8bytes
再比如decimal(20,6)
,整数14位,需要4字节存9位,还需3字节存5位;小数6位,需3字节。共10bytes
参考
MySQL数字类型int与tinyint、float与decimal如何选择
mysql 数据类型
未完,待续~