(2)MySQL数据类型
一.整数类型
整数类型 | 字节数 | 默认显示宽度 |
---|---|---|
TINYINT | 1 | 4 |
SMALLINT | 2 | 6 |
MEDIUMINT | 3 | 9 |
INT | 4 | 11 |
INTEGER | 4 | |
BIGINT | 8 | 20 |
- 支持
数据类型**(显示宽度)**
的写法,例如int(4)
。若不指定,有默认的显示宽度。 - 若使用
int(zerofill)
数字没有达到显示宽度的会被0填补,显示类型变为UNSIGNED,长度比默认显示宽度少1 - 插入数据的长度若大于默认显示宽度,默认显示宽度就无效;但插入的数据不能大于该类型的最大值
二.浮点数和定点数
类型 | 字节数 |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
DECIMAL(M,D)或DEC(M,D) | M+2 |
定点数DECIMAL的取值范围与DOUBLE相同,有效范围由M决定。可以用数据类型(M,D)
指定浮点数,定点数精度。
- M称为精度,数据的总长度,不算小数点
- D称为标度,小数点后的长度
- 虽然定义标准可以定义浮点数,但最好不要使用,因为会影响数据库迁移。
- 若插入值精度大于默认精度,会进行四舍五入处理。DECIMAL(M,D)会有警告
三.日期与时间类型
为了方便存储时间而设计
整数类型 | 字节数 | 取值范围 | 零值 |
---|---|---|---|
YEAR | 1 | 1991~2155 | 0000 |
DATE | 4 | 1000-01-01~9999-12-31 | 0000:00:00 |
TIME | 3 | -838.59.59~838.59.59 | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23.59.59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 19700101080001~20380119111407 | 00000000000000 |
3.1 YEAR类型
- 输入4位字符串:插入的日期若超过范围,就会插入0000,并且出现警告
- 输入2位字符串
- 0069:对应20002069 ,PS:输入0也会对应2000
- 7090:对应19701990
- 输入2位数字
- 0:对应0000
- 169:对应20012069
- 7099:对应19701999
3.2 TIME类型
- 赋值格式:
D HH:MM:SS
类型:字符串
输入时可以任意输入D HH
HH:MM
SS
等都可以
- D:天数,取值范围 0~34,保存时 $$HH=24*D+HH$$
如输入'2 11:30:50',根据公式转换为'59:30:50' - HH:取值范围 0~23
- SS,MM:取值范围 0~59
- 赋值格式:
HHMMSS
类型:字符串或数值
- 若输入323432,无论字符串或数值,转化为 32:34:32
- 若输入0或'0',输出0000:00:00
- 插入
CURRENT_TIME
和NOW()
输出现在的系统时间
3.3 DATE类型
- 字符串
YYYY-MM-DD
或YYYYMMDD
格式表示,YYYY年,MM月,DD日 - 还支持用任何标点符号分割,如
YYYY*MM*DD
,YYYY@MM@DD
- 字符串
YY-MM-DD
或YYMMDD
格式表示 - YY 取 '00''69':对应20002069
- YY 取 '70''99':对应19701999
- 数字
YYYYMMDD
或YYMMDD
格式表示,YY取值如上 - 插入
CURRENT_DATE
和NOW()
输出现在的系统日期
虽然可以用不标准的语法,但是实际中还是使用标准语法好
3.4 DATETIME类型
DATE+TIME 组合,去掉TIME类型的D
YYYY-MM-DD HH:MM:SS
标准写法用法与DATE类型一样
只能用
NOW()
输出现在的系统日期时间
3.5 TIMPSTAMP类型
TIMPSTAMP类型的显示格式与DATETIME是一样的,只不过范围比DATETIME小
区别:
- TIMPSTAMP类型插入
NOW()
、NULL
、CURRENT_DATESTAMP
和无任何输入时候,都会输入系统当前的时间 - 会根据不同时区来显示时间,缺点是范围太小
四.字符串类型
字符串类型包括:CHAR,VARCHAR,BLOB,TEXT,ENUM,SET
4.1 CHAR与VARCHAR
在建表的过程中指定了M-最大长度:字符串类型(M)
- CHAR: 长度0~255,即0 <= M <= 255
- VARCHAR: 长度0~65535,如VARCHAR(100),不是每条记录都占100空间,而是在100空间内使用多少,分配多少$$实际占用空间=字符串长度+1$$
4.2 TEXT类型
TEXT只能保存字符数据
整数类型 | 允许长度 | 存储空间 |
---|---|---|
TINYTEXT | 0~255 | 值的长度+2字节 |
TEXT | 0~65535 | 值的长度+2字节 |
MEDIUMTEXT | 0~167772150 | 值的长度+3字节 |
LONGTEXT | 0~4294967295 | 值的长度+4字节 |
4.3 ENUM类型
又称为枚举类型,创建表的时候,其基本形式如下:
属性名 ENUM('值1','值2',···'值n-1','值n')
这些值末尾的空格会被自动删除
插入时候:
1.不加NOT NULL
- 不指定插入值或者指定插入null,那插入的值为null
- 插入时候会自动创建索引,插入null,索引为null;插入非指定值,索引为0
2.加上NOT NULL
- 不插入指定值:会插入
值1
,也就是第一个元素 - 插入null,会报错
若只能选取列表中一个值,用ENUM,但有多个值的话,就是用set,我们往下看
4.4 SET类型
格式:属性名 SET('值1','值2',···'值n-1','值n')
细节与ENUM差不多,但是SET元素最高只有64位。与ENUM一样,插进去的每一个元素都有顺序的索引值,但插入的元素顺序无关紧要,例如你插入多个值,显示的数据会按照设定时候的顺序排序
五.二进制类型
整数类型 | 取值范围 |
---|---|
BINARY(M) | 字节数为M,允许范围定长0~M的二进制字符串 |
VARBINARY(M) | 允许范围变长0~M的二进制字符串,字节为数值长度+1 |
BIT(M) | M位二进制数据,M最大值64 |
TINYBLOB | 可变长二进制数据,最多255字节 |
BLOB | 可变长二进制数据,最多(2^16-1)字节 |
MEDIUMBLOB | 可变长二进制数据,最多(2^24-1)字节 |
LONGMBLOB | 可变长二进制数据,最多(2^32-1)字节 |
5.1 BINARY(M)与VARBINARY(M)
BINARY(M)最大长度已经固定,不足的由\0
补全,而VARBINARY(M)自动增加不用。
5.2 BIT与BLOB
BIT没什么好说的插入的是二进制
BLOB是一种特殊的二进制类,可以保存数据量很大的二进制,比如图片、PDF文档、MP3,其与TEXT很像,不过操作的数据类型不同。
六.如何使用BOOLEAN型数据?
在MySQL中,BOOL与BOOLEAN类型等价于TINYINT(1)