数据类型分类
数据类型一般分为数值类型和字符串类型。
数值类型
这里详解一些常用的数值类型
类型 | 字节 | 最小值 | 最大值 |
tinyint | 1 | -128 | 127 |
tinyint unsigned | 1 | 0 | 255 |
small int | 2 | -32768 | 32767 |
small int unsigned | 2 | 0 | 65535 |
medium int | 3 | -8388608 | 8388607 |
medium int unsigned | 3 | 0 | 16777215 |
int | 4 | -2147483648 | 2147483647 |
int unsigned | 4 | 0 | 4294967295 |
bigint | 8 | -9223372036854775808 | 9223372036854775807 |
bigint unsigned | 8 | 0 | 18446744073709551615 |
1. tinyint 类型
上面操作我们可以看到,创建了一个名为 number 的表,有一列 num 是 tinyint 类型,插入数据 1 的时候,成功插入,插入 128 的时候,这时提示我们越界出错了。因为 tinyint 类型的最大值为 127。
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过 unsigned 来说明某个类型是无符号的。
其他的整型类型列如 int ,small int 等,用法和上面一样。
2. bit 类型
用法
bit(M)
位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
上面操作我们可以看到,定义了一个 8 位的 bit 类型的字段,我们插入了一个值为 10 的数据,但是显示出来的内容却很奇怪,其实 bit 类型的字段在显示时,是按照 ASCII 码对应的值显示的。
我们插入 65 的时候,可以看到,显示出来的就是大写字母 'A' 。
3. 小数类型
float 类型
float(m, d) [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
例如:float(4,2) 表示的范围是 -99.99 ~ 99.99 ,MySQL 在保存值时会进行四舍五入。
对于无符号 float ,列如:float(4,2) unsigned 表示的范围是 0 ~ 99.99 ,MySQL 在保存值时会进行四舍五入。
decimal 类型
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal 类型的用法和 float 一样,区别是两个类型的精度不一样。
我们发现插入同样的数值时,两个类型显示的数据不一样,decimal 的精确度更高一点。
float 精确度大约是 7 位。decimal 整数最大位数 m 为 65。支持小数最大位数 d 是 30。如果 d 被省略,默认为 0。如果 m 被省略,默认是 10。
字符串类型
1. char 类型
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
可以看到,我们定义一个列 类型为 char 长度为 2,可以插入 2个字符,超过这个长度就不行了。char 类型 最大长度是 255。
2. varchar 类型
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
注意我们这里说的 L 的值是指长度,而不是字节,那么因为最大字节数为 65535 那么长度是多少呢?
1. varchar 字节数虽然为 65535,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
2. 当我们的表的编码是 utf8 时,varchar(n) 的参数 n 最大值是 65532/3=21844 因为 utf8 中,一个字符占用 3 个字节。
3. 如果编码是 gbk,varchar(n) 的参数 n 最大是 65532/2=32766 因为 gbk 中,一个字符占用 2 字节。
我们可以看到上面的操作证明了 varchar 类型的最大长度。
3. char 和 varchar 比较
1. 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号。
2. 如果数据长度有变化,就使用变长 (varchar) , 比如:名字,地址,但是你要保证最长的能存的进去。
3. 定长的磁盘空间比较浪费,但是效率高。
4. 变长的磁盘空间比较节省,但是效率低。
4. 日期和时间类型
常用的日期和事件类型有三个
datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节。
date:日期 'yyyy-mm-dd',占用三字节。
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节。
添加数据时,事件戳会自动补上,当然显示的是你系统的时间,不一定就是准确的时间。
5. enum 和 set 类型
enum 枚举,单选类型。
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
set 集合,多选类型。
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。
第1-8个成员,占一个字节;第9-16个成员,占两个字节;第17-24个字节,占三个字节;第25-32个成员,占四个字节;第33-64个成员,占8个字节。
在存储的时候,从第一个成员开始,分别对应的二进制为:0001,0010,0100,1000,10000......
假如我们在使用 set 类型时指定一个数值 3,那么就是 0011,也就是 1 和 2 的集合。