MySQL-数据类型
1.数值类型
- 整型
- int大整型(4个字节)/取值范围:0~2**32-1(42亿多) -21亿多~+21亿多
- tinyint微小整型(1个字节)
有符号(signed默认)/取值范围:-128~127
无符号(unsigned) /取值范围:0~255 - smallint小整型(2个字节)
- bigint极大整型(8个字节)/取值范围:0~2**64-1
- 浮点型
- float(4个字节,最多显示7个有效位)
- 用法:
字段名 float(m,n) # m:总位数,n:小数位位数
(用float的时候m最大为7,不然超过7位会随机显示)
如float(5,2)/取值范围:-999.99~999.99 - 注意:
浮点型插入整数时会自动补全小数位
小数位如果多于指定的位数,会对下一位四舍五入
- 用法:
- double(8个字节,最多显示15个有效位)
- decimal(最多显示28个有效位)
- 字段名 decimal(m,n)
- 存储空间(整数部分和小数部分分开存储)
规则:将9位数字的倍数包装成4个字节
即:对于每一个部分,需要4个字节来存储9位数的每个倍数
剩余数字所需的存储空间如下表
剩余数字 字节
0 ------------->0
1-2 ----------->1
3-4 -----------> 2
5-6 ---------->3
7-9 --------->4
示例:decimal(19,9)
整数部分:10/9=商1余1 4个字节+1个字节=5个字节
小数部分:9/9=商1余0 4个字节+0个字节=4个字节
2.字符类型
- char(定长)
- 宽度取值范围:1~255
- 不给定宽度默认为1
- varchar(变长)
- 取值范围:1~65535
- char和varchar的特点
char:浪费存储空间,但性能高
varchar:节省存储空间,但是性能低 - text/longtext(4G)/blob/longblob(4G)
- 字符类型的宽度和数值类型的宽度的区别
- 数值类型的宽度为显示宽度,仅仅用于select查询时显示,
和占用的存储空间大小无关,可用zerofill查看效果 - 字符类型的宽度超过则无法存储
附:关于VARCHAR与CHAR的选取
在数据库中,VARCHAR
是变长的,CHAR
是定长的,所以,当存储的数据的长度固定时,应该优先选取CHAR
,如果长度不固定,则应该使用VARCHAR
。
假设某字段设计为CHAR(15)
,当存入hello
字符串时,由于字符串的字符数量只有5个,所以,数据库会补10个空格,以达到15的长度,最终,实现占用字符数是15个;如果字符设计为VARCHAR(15)
时,实际占用字符数就是5个!
无论是使用CHAR
还是VARCHAR
,在设计字段类型时,都必须明确的指定字符数量,并且,存入数据时,如果超出了限制的字符数量,都会出现错误。
在数据库中,如果使用VARCHAR
类型存储数据时,数据库默认会另外使用1个字节来记录实际存储的字符数量,例如使用VARCHAR(15)
存储hello
字符串时,数据库会另外记录下5
这个值,以便于后续需要读取数据时,知道要读取几个字符!由于1个字节可以表示的数据大小是有限的,所以,如果VARCHAR
中设置的字符数量超出255
,数据库会自动改为使用2个字节来记录实际存储的字符数量,可支持的最大数量就达到65535
。
3.枚举类型(字段值只能在列举的范围内选择)
- 单选(最多65535个不同值)
字段名 enum(值1,值2,…) - 多选(最多64个不同值)
字段名 set(值1,值2,…,值N)
4.日期时间类型
- year:年 YYYY
- date:日期 YYYYMMDD
- time:时分秒 HHMMSS
- datetime:
timestamp:日期时间YYYYMMDDHHMMSS
(插入记录时datetime不给值默认返回NULL,而timestamp字段默认返回系统当前时间)
日期时间的函数:
-
NOW() [大小写都可以]返回服务器当前时间YYYY-MM-DD HH:MM:SS
-
curdate() 返回当前日期 YYYY-MM-DD
-
curtime() 返回当前时间 HH:MM:SS
-
year(时间) 返回指定时间的年份 YYYY
-
date(时间) 返回指定时间的日期 YYYY-MM-DD
-
time(时间) 返回指定时间的时间 HH:MM:SS
(时间用字符串的格式如:‘1995-10-22’)
日期时间运算
-
语法格式
select … from 表名 where 字段名 运算符 (时间 interval 时间间隔单位);
interval是间隔类型关键字
时间间隔单位:
1 day / 2 hour | minute | year | month -
示例:
# 查询一天以内的记录
select * from t11 where meeting > (now() - interval 1 day);
现在时间 - 1天时间 = 1天以前的时间点
# 查询1天以前3天以内的记录:
select * from t11 where meeting < (now()-interval 1 day) and
meeting > (now()-interval 3 day);