MySQL数据类型
目录
- 数值类型
- 整数
- 浮点数
- 定点数
- 位值
- 布尔值
- 时间/日期类型
- YEAR类型
- TIME类型
- DATE类型
- DATETIME类型
- TIMESTAMP类型
- 字符串类型
- CHAR类型和VACHAR类型
- BINARY类型和VARBINCHAR类型
- BLOB类型和TEXT类型
- ENUM类型
- SET类型
1.数值类型
1.1.整数
整数类型 | 字节数 |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT | 4 |
INTEGER | 4 |
BIGINT | 8 |
官方文档中的定义是这样的
INT[(M)] [UNSIGNED] [ZEROFILL]
我们就用这一个来举例:
其中(M)
表示最大显示宽度,最大有效显示宽度的值是255
,这个只用于数值显示时,对于宽度短于该列宽度的值左补全显示,并不是数字的最大的位数是M;
UNSIGNED
:和C语言
中的unsigned
一样表示无符号数,这个不经常用到,只是在存储IP
时用到int unsigned
时用到,因为IP
地址一般形如127.0.0.1
;最大为255.255.255.255
,用int
存储时存不下但是int unsigned
是刚刚好能存下的;
补充
在MySQL
中有把ip
地址转换成int
类型的函数;
INET_ATON(127.0.0.1)
负责把ip
地址转化为数字;
INET_NTOA()
负责把数字转化为ip
地址;
接下来演示一下:
接下来给大家讲解一条命令:
show create table ip\G;
这条命令可以看到建立数据表的细节;
这里我们可以看到这张数据表的所有细节:
ENGINE=InnoDB
:所用的存储引擎是InnoDB
;
CHARSET=latin1
:表示所用的字符集是latin1
常见的字符集还有gbk
,utf8
;后两个是中文字符集,utf8
一个字符等于三个字节,gbk
一个字符等于两个字节;
ZEROFILL
:是在数字前填充0
;具体的我们来演示一下;
但是这里a
的长度还是1;
1.2.浮点数和定点数
我们直接来看官方文档对于浮点数和定点数的定义;
float[(M, D)] [UNSIGNED] [ZEROFILL]
double[(M, D)] ...
float(p) ...
decimal[(M, D)] ...
float
和double
中的M
和D
表示精度和标度;M
是数据的总长度(小数点不算位数),D
表示小数点后位数;这里需要注意当这两个值确定了以后,整数部分也就确定了,整数部分的位数不能大于这个值,但是小数部分可以大于D
但是会被截取,采取四舍五入法;
float(p)
:p
表示精度当0<=p<=24
时MySQL
把他当做float
,当24<p<=53
时被当做double
;
float(p)
是很特殊的他只保留整数部分高位6
位,剩下的部分四舍五入;
高精度类型 DECIMAL
;
这个类型用来保存,必须为确切精度的值,如财务,足球赔率等;
M
最大为65
,D
最大为30
;
这个就不做试验了,因为我觉得他和上面两个浮点数没有太大差别,主要就是M
和D
的值大了;
1.3.位值
BIT(M)
类型表示允许存储M
位数值,M
的范围是1~64
;占用的空间是(M+7)/8
;如果BIT(M)
列分配的值小于M
则会在高位补充0
;
我们在插入时可以直接插入十进制也可以插入二进制;但是注意插入十进制时不要超过了M
;
这里我们会发现使用select *from t;
我们什么也看不到,这是因为采用了位模式我们不能直接查看;
所以要用select bin(a) from t;
1.4.布尔值
我们来看个东西神奇;
其实在MySQL
中布尔值存在数据库里就是tinyint
一个整数类型;
2.时间日期类型
2.1.YEAR
year
类型占用一个字节,定义时可以是year(2)
或year(4)
;不过现在year(2)
已经很少了,现在基本上就是year(4)
;
year(4)
的取值范围是1901~2155
以及0000
;
值得注意的是,在插入2000
这个年份时需要用到:
insert into t values('00');
或
insert into t values('0');
;
例:
我们看到year
类型默认为year(4)
;
2.2.TIME类型 DATETIME类型 DATE类型
因为date
和time
合起来就是datetime
所以我们就直接说这个datetime
;
datetime
格式:YYYY-MM-DD HH:MM:SS
占用8个字节;范围是:
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
这里值得注意的是,两个数字中间的符号可以是任何符号,也可以没有符号,具体的看示例;
需要注意的一点是,如果在年份写了两个数字他就会自动补全到最近的年份;
2.3.TIMESTAMP类型
TIMESTAMP
类型和DATETIME
类型的显示是一样的,不同的是TIMESTAMP
类型占四个字节,范围为1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
;
主要这个类型要说的是和时区的关系;
当你检索一个值的时候,他会把按当前时区显示,我们来做一个小实验,这里我们创建一个timestamp
和datetime
作对比:
这里我们改一下我们的时区然后再改回来(我们改到伦敦):
我们从这个实验就能看到timestamp
和datetime
的区别;
TIMESTAMP
类型还有一个自动更新的属性:
3.字符串类型
3.1.CHAR类型和VARCHAR类型
char(M)
这里的M最大为255表示字符数,而不是字节数,想utf8
字符集一个字符等于三个字节,这里还是能放下255个字符占用255*3
个字节;
varchar(L)
这里和char
一样L
表示字符数,他实际存储的字节数是字符串L长度+一个记录字符串长度的字节如果L小于255记录长度的字节是1,大于255记录字节长度的字节是2;
值 | CHAR(8) | 存储需求 | VARCHAR(8) | 存储需求 |
---|---|---|---|---|
‘ab’ | ‘ab’ | 8 | ‘ab’ | 3 |
‘abc’ | ‘abc’ | 8 | ‘abc’ | 4 |
从这个表格就能看出来两者的区别了;
3.2.BINARY和VARBINARY
binary(M)
和varbinary(M)
这里与char
和varchar
最大的区别就是这里的M
是字节数而不是字符数了;
目录后面几个先不写了,等后面遇到学了再写;