最近在学习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 数据类型
未完,待续~