首先补充点了解的小知识;
select * from mysql.user #显示出来乱了 select * from mysql.user\G #加了\G后一行一行显示了
1、数据类型:分不一样种类去存不一样类型的数据
存储引擎决定了表的类型,而表内存放的数据也要有不一样的类型,每种数据类型都有本身的宽度,但宽度是可选的mysql
一、数字(默认是有符号的)
sql
数字又分为:数据库
整型:tinyint(小整型):一个字节服务器
int(整型):四个字节。注意:int的 宽度指的是显示的宽度,与存储无关ide
bigint(大整形):八个字节post
======================================== tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 ~ 127 无符号:0~ 255 PS: MySQL中无布尔值,使用tinyint(1)构造。
[unsigned]参数和[zerofill]参数的应用
3.将有符号的修改成无符号的:alter table t1 modify unsigned;(注意,若是里面有值了,
得把里面的值清空了再修改)
4.alter table t2 modify id int(10) zerofill; 若是显示不够,就用zerofill填充
======================================== int[(m)][unsigned][zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号: -2147483648 ~ 2147483647 无符号:0~ 4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号:-9223372036854775808 ~ 9223372036854775807 无符号: 0~ 18446744073709551615
小数:spa
float:在位数比较短的状况下不精准(**** 数值越大,越不许确 ****)操作系统
double:在位数比较长的状况下不精准(**** 数值越大,越不许确 ****)3d
decimal:若是是小数,则推荐使用decimalcode
由于精准,内部原理是以字符串的形式去存

1 先建立一个数据库:create datdabase test; 2 -----------验证1:int,tinyint,bigint---- 3 create table t1(id tinyint); 4 create table t1(id int); 5 create table t1(id bigint); #若是数字比较大的时候就用bigint 6 1.若是没有指定符号。默认的是有符号的 7 2.insert into t1(-129) #就会报错了,由于范围是-128~127 8 3.将有符号的修改成无符号的:alter table t1 modify unsigned;(注意,若是里面有值了,得把里面的值清空了再修改) 9 4.alter table t2 modify id int(10) zerofill; 若是显示不够,就用zerofill填充 10 5.宽度:跟存的没有关系,指的是显示的宽度 11 12 13 ----------验证2:float,double------ 14 create table t3(salary float(5,2)) #5表明salary总共多宽,2表明小数点后保留2位,那么整数部分有3位 15 insert into t3 values(3.725454); 16 insert into t3 values(-3.725454); 17 insert into t3 values(1111.725454); #像这个就会报错了 18 insert into t3 values(111.725454); 19 20 bit类型了解就行了 21 bit类型:表明二进制的类型 22 ----------验证3:bit-------- 23 create table t3(x bit); 24 insert into t3 values(0),(1); 25 insert into t3 values(0),(2)); #只能存二进制的,这样的话就会报错 26 select * from t3;
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok
二、字符、
char:简单粗暴,不够就用空格凑够固定长度存放起来,浪费空间,可是存储速度快
(牺牲空间,提升速度)
varchar(你有几个就存几个):精准,计算出待存放数据的长度,节省空间,存取速度慢
(牺牲速度,提升效率)
1.-----------------
create table t6(name char(4));
insert into t6 values('alexsb');
insert into t6 values('欧德博爱');
insert into abc values('艾利克斯a');
2.-------------
create table t7(x char(5),y varchar(5)); insert into t7 values('sff','aaaaa'); select char_length(x),char_length(y) from t7; 查看字符长度 set sql_mode='pad_char_to_full_length'; #打回原形 insert into t7 values('你好啊','好好好!');#utf-8里面一个汉字表明三个字节,那'你好啊'就表明九个,
#加上两个空格就是11个字节 select length(x),length(y) from t7; 查看字节长度
查看字符的长度
查看字节的长度
三、日期
做用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过时时间等
有下面几种类型:
datatime:2017-09-06 10:30:22
data:2017-09-06
time:10:30:22
year:2017
timeatamp:和datatime是同样的,就是支持的范围datatime的大
---------------验证4:日期类型------- create table stu( id int, name char(5), born_data date, born_year year, reg_time datetime, class_time time ); insert into stu values(1,'ao',now(),now(),now(),now()); insert into stu values(1,'xiao','2017-09-06','2017','2017-09-06 10:39:00','08:30:00'); #了解 insert into stu values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00'); insert into stu values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); 没有-的能够不用加引号 insert into stu values(1,'alex','20170906',2017,'20170906103900','083000'); 也能够吧符号取了连写
============注意啦,注意啦,注意啦=========== 1. 单独插入时间时,须要以字符串的形式,按照对应的格式插入 2. 插入年份时,尽可能使用4位值 3. 插入两位年份时,<=69,以20开头,好比50, 结果2050 >=70,以19开头,好比71,结果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+

1 在实际应用的不少场景中,MySQL的这两种日期类型都可以知足咱们的须要,存储精度都为秒,但在某些状况下,会展示出他们各自的优劣。下面就来总结一下两种日期类型的区别。 2 3 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 4 5 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操做系统以及客户端链接都有时区的设置。 6 7 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。所以,TIMESTAMP比DATETIME的空间利用率更高。 8 9 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),若是不作特殊处理,而且update语句中没有指定该列的更新值,则默认更新为当前时间。
四、枚举与集合
字段的值只能在给定范围中选择,如单选框,多选框
enum枚举:规定一个范围:这个范围能够有多个,可是为该字段传值时,只能取规定范围内的其中一个
set集合:规定一个范围:这个范围能够有多个,可是为该字段传值时,能够取规定范围内的一个或多个
enum若是你不传值,默认是第一个值,或者为NUll
----------枚举和集合----------- create table stu1( id int primary key auto_increment, name char(5), sex enum('male','female'), #enum 表明枚举类型 hobbies set('eat','play','study','coding') #set 表明集合类型 ); insert into stu1(name,sex,hobbies) values('haiyan','none','dsfdg'); select * from stu1; #若是设置了sex是枚举类型,就的从设定的里面选其中的一个存 insert into stu1(name,sex,hobbies) values('haiyan','female','play,study'); select * from stu1; #若是设置了hobbies是集合类型,就得从设定的里面选其中一个或者多个值来存
没有按照枚举或集合规定的传值的结果
按照枚举或集合的规定传值的结果