Mysql---数据类型
一.整数类型
1.包括TINYINT SMALLINT MEDIUMINT INT BIGINT,常用的主要为int 及tinyint
2.tinyint
tinyint【(m)】 【unsigned】 【zerofill】 默认有符号,m可以不写,默认为tinyint(4)
小整数,保存数据范围如下:
有符号:-128~127
无符号:0~255
PS: MySQL中无布尔值,使用tinyint(1)构造
3.int
int【(m)】 【unsigned】 【zerofill】 默认有符号,m可以不写,默认为int(11)
整数,保存数据范围如下:
有符号:-2147483648 ~ 2147483647
无符号:0 ~ 4294967295
4.整型的m为显示宽度,其他类型的为存储宽度,zerofill为补位符,当实际位数比m小时,可选用zerofill,即用0来补位。
二.浮点型 (M,D)------(总长,小数点后位数)
1.浮点型
a.float 单精度 随小数点位增加而不准确 (M,D)------(255,30)
b.double 双精度 随小数点位增加而不准确 (M,D)------(255,30)
2.定点型 decimal 准确的小数(M,D)------(65,30)
# 分别对三张表插入相应的记录
mysql> insert into t5 values(1.1111111111111111111111111111111);#小数点后31个1
Query OK, 1 row affected (0.01 sec)
mysql> insert into t6 values(1.1111111111111111111111111111111);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t7 values(1.1111111111111111111111111111111);
Query OK, 1 row affected, 1 warning (0.00 sec)
# 查询结果
mysql> select * from t5; #随着小数的增多,精度开始不准确
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t6; #精度比float要准确点,但随着小数的增多,同样变得不准确
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t7; #精度始终准确,d为30,于是只留了30位小数
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)
三.日期类型
常用:datetime date time year
YEAR
YYYY(1901/2155)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
1.year 无论year指定何种宽度,最后都默认是year(4)
2.mysql自带的now()函数,获取当前类型指定的时间
3.datetime与timestamp的区别
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。
下面就来总结一下两种日期类型的区别。
1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,
操作系统以及客户端连接都有时区的设置。
3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),
如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
4.注意事项
a. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
b.插入年份时,尽量使用4位值
c.插入两位年份时,<=69,以20开头,比如50, 结果2050
>=70,以19开头,比如71,结果197
四.字符类型
1.char 定长,存储速度快,浪费空间
让char类型显示字符长度:
设置当前:SET sql_mode=PAD_CHAR_TO_FULL_LENGTH;
设置当局:SET global sql_mode=PAD_CHAR_TO_FULL_LENGTH
2.varchar 变长,存储速度慢,节省空间
3.效率:char>varchar>text
4.两个方法
a.length() 查看字节数
b.char_length() 查看字符数
五.枚举和集合
1.枚举 enum 单选 只能在给定的范围内选一个---多选一
2.集合 set 多选 可以在给定的范围内选一个或选多个---多选一或多选多
mysql> create table consumer(
-> id int,
-> name varchar(50),
-> sex enum('male','female','other'),
-> level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一
-> fav set('play','music','read','study') #在指定范围内,多选多
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into consumer values
-> (1,'赵云','male','vip2','read,study'),
-> (2,'赵云2','other','vip4','play');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from consumer;
+------+---------+-------+-------+------------+
| id | name | sex | level | fav |
+------+---------+-------+-------+------------+
| 1 | 赵云 | male | vip2 | read,study |
| 2 | 赵云2 | other | vip4 | play |
+------+---------+-------+-------+------------+
2 rows in set (0.00 sec)