数值类型
数值类型包含:int
tinyint
bigint
float
decimal
1、整型 unsigned
signed
int
大整型(占 4 个字节的存储空间)
0 ~ 2**32-1(约为42亿)
tinyint
微小整型(占 1 个字节的存储空间)
0~255
bigint
极大整型(占 8 个字节的存储空间)
create table stu (id int,name char(15),age tinyint unsigned,phone bigint);
备注:1字节 = 8位,可以表示
2*8 = 256
种状态,表示无符号的整形数字范围为0-255
,表示有符号整形范围为-128-127
。
2、浮点型
float
占4个字节,最多显示7个有效位。常用于成绩。
...字段名 float(总位数, 小数位) ...
float(5,2)取值范围:
-999.99~+999.99
decimal
最多可以显示 28 个有效位
...字段名 decimal(总位数, 小数位) ...
存储空间计算:整数部分和小数部分分开存储,将 9 的倍数包装成 4 个字节,余数占用的字节数如下:
decimal
的整数位和小数位模9的余数和字节对照表
余数 | 字节 |
---|---|
1-2 | 1个字节 |
3-4 | 2个字节 |
5-6 | 3个字节 |
7-8 | 4个字节 |
例如:decimal(19,9)
整数部分:
10/9=1 ... 1 -----> 4字节 + 1字节 = 5字节
小数部分:
9/9=1 ... 0 -----> 4字节 + 0字节 = 4字节
注:float的最大缺陷最多显示7个有效位,因此使用较少;而decimal则是使用最为频繁的数据类型,效率非常高,且存储的范围非常大。
字符类型
char
定长:当列中存储的字符串达不到最大长度时,使用空格进行补足。
注:
char
必须说明宽度值。
varchar
变长
注:
varchar
必须说明宽度值。
char
浪费存储空间,但性能高。varchar
节约存储空间,但存储性能低。
text / longtext(4G)
数值类型宽度为显示宽度,和占用存储空间大小无关;字符类型的宽度,超过则无法存储:
# int(3)为显示宽度,int占用4个存储字节,表示0~2*32-1
ysql> create table tab3(number int(3) zerofill);
ysql> insert into tab3 value(1),(2),(03);
ysql> select * from tab3;
001 |
002 |
003 |
ysql> insert into tab3 value(12345678);
ysql> select * from tab3;
001 |
002 |
003 |
12345678 |
枚举类型
对于枚举类型的字段,字段值只能在列举的范围内选择。
# 多选
字段名 enum(val1,val2,...)
# 单选
字段名 set(val1,val2,...)
日期时间类型
日期时间类型:date
time
datetime
timestamp
date 日期:
"YYYY-MM-DD"
time 时间:
"HH:MM:SS"
datetime 日期时间:
"YYYY-MM-DD HH-MM-SS"
timestamp 日期时间:
"YYYY-MM-DD HH-MM-SS"
注:datetime 不给值默认返回
Null
;timestamp(时间戳)不给值默认返回当前时间。
日期时间函数
日期时间函数:NOW()
CURDATE()
CURTIME()
NOW() 返回服务器当前的时间:
select now();
CURDATE() 返回当前日期:
select curtime();
CURTIME() 返回当前时间:
select curdate();
注:在命令行查询函数返回的结果 :
select 函数();
,如:select database();
查询当前所在数据库。
插入日期时间:
insert into tab1 values(...,CURDATE(),CURTIME(),NOW());
日期时间运算
语法格式:
select ... from 表名 where 字段名 运算符 (时间 - interval 时间间隔单位);
说明:时间间隔需要使用
interval
关键字声明,时间间隔单位可以是1 day
2 hour
1 minute
1 year
3 month
。
示例:
# 现在的时间 - 1天的时间 = 一天前的时间
where meeting > (now() - interval 1 day)
查询1天以内的记录:
select * from 表名 where 字段名 > (now() - interval 1 day)
查询2年前至今年的记录:
select * from tb2 where time1>(now() - interval 2 year) and time1<(now() + interval 1 year);