数据类型
MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型、字符串类型、时间日期类型;
1、数值类型:
mysql支持标准SQL 中的数据类型其中包括严格数据类型(INTEGER 、SMALLINT和decimal),以及近似数据类型(FLOAT 和double等)
MYSQL 支持在类型名称后面的小括号内指定宽度,如int(5)表示,如果数值宽度小于5,那么不足的位置用“ ”填在数值的前面,即890存储方式为 890 若不指定宽度默认为int(11) .一般配合zerodill使用,即将原来的空字符改为0.
下面就来看看效果
在此之前我们要先学一下(详细的以后在研究)
- 创建表格的语法:mysql> create table grade(number int(11),grade int(5));
- 向表中插入数据 insert into grade values(321,86);
即 insert into 表名(数值1,数值2...)
- 简单的数据查询:mysql> select *from grade; //查询表中所有数据
- 修改表中列的数据类型 alter table grade modify number int zerofill;
下面我们来看看是不是以“ ”填充
若使用zerofill:
不知道你是否会有疑问,如果我设置的长度是5,我存入一个长度大于5的数会出现什么结果?
我们来看一下:
我们可以看到他存进去了,而且是你想要存成的样子。。。实际上当你的数值位数大于预先指定的宽度时,你设置的数值宽度已经没有任何意义了。
整数数据类型还有个特殊的属性:AUTO_INCREMENT(每张表最多有一个AUTO_INCREMENT,且对于任何使用此属性的列必须定义为 NOT NULL ,并并定义为 PRIMARY KEY 或 unique键 ),看词知意,他会根据你输入的值自动给行排序,在你需要 产生唯一的标识符或者顺序值时,他是个不错的选择。
mysql> create table grade(ID int AUTO_INCREMENT NOT NULL PRIMARY KEY,NUMBER INT(8),NAME VARCHAR(5),GRADE INT(4));
mysql> create table grade1(ID int AUTO_INCREMENT NOT NULL ,UNIQUE(ID),NUMBER INT(8),NAME VARCHAR(5),GRADE INT(4));
测试结果如下
你可以看到它自动按照ID的大小排序了。。。。
create table grade(ID int AUTO_INCREMENT NOT NULL PRIMARY KEY,NUMBER INT(8),NAME VARCHAR(5),GRADE INT(4)); INSERT INTO GRADE VALUES(12,1234,"ZS",34); INSERT INTO GRADE VALUES(56,1234,"ZS",34); INSERT INTO GRADE VALUES(3,1234,"ZS",34); INSERT INTO GRADE VALUES(1,1234,"ZS",34); INSERT INTO GRADE VALUES(9,1234,"ZS",34); INSERT INTO GRADE VALUES(2,1234,"ZS",34); INSERT INTO GRADE VALUES(5,1234,"ZS",34); select * from grade;
create table grade1(ID int AUTO_INCREMENT NOT NULL ,UNIQUE(ID),NUMBER INT(8),NAME VARCHAR(5),GRADE INT(4)); INSERT INTO grade1 VALUES(12,1234,"ZdS",34); INSERT INTO grade1 VALUES(56,1234,"ZS",34); INSERT INTO grade1 VALUES(3,1234,"ZS",34); INSERT INTO grade1 VALUES(1,1234,"ZS",34); INSERT INTO grade1 VALUES(9,1234,"ZS",34); INSERT INTO grade1 VALUES(2,1234,"ZS",34); INSERT INTO grade1 VALUES(5,1234,"ZS",34); select * from grade1;mysql在表示小数时有两种方式:浮点型和定点型。浮点数包含float(单精度) 和 double(双精度)。定点数只有一种decimal。浮点数和定点数都可以用数据类型(M,D)的方式表示-(M,D)表示 一共有M位数字(整数位+小数位),小数点后面有D位。
如果我位数超了会有什么结果???
由上我们可以看出小数位全都截去了,也就是说如果你小数位数多了,会失真,会不会四舍五入呢?
答案是肯定的,会,那整数位多了呢??
你会看到他报错了,告诉你你的数太大了,我不能接受。。。
综上,在mysql 中,对于浮点数和定点数来说:如果小数位超了,四舍五入,整数位超了,直接报错,不会存入数据表。
creATE TABLE n1(id1 float(5,2),id2 double(5,2),id3 decimal(5,2)); insert into n1 values(9.26,9.26,9.26); select * from n1; insert into n1 insert into n1 values(119.261,119.261,119.261); select * from n1; insert into n1 values(9.269,9.269,9.269); select * from n1; values(12139.26,12139.26,12139.26); select * from n1;
2.日期类型
日期类型总共有以下点:
表示年份:year;(高版本mysql 已经不支持)
表示日期:DATE;
表示时间: TIME;
表示年月日时分秒:datetime;
一个关于datetime 的小例子:
create table date1( dt DATETIME); INSERT INTO DATE1 VALUES('2018-04-15 18:34:25'); INSERT INTO DATE1 VALUES('2018/04/15 18+34+25'); INSERT INTO DATE1 VALUES('20180415183425'); INSERT INTO DATE1 VALUES(20180415183425); SELECT* FROM DATE1;
运行结果如下:
crEate table ti (d DATE,T TIME, DT DATETIME); INSERT INTO TI VALUES(NOW(),NOW(),NOW()); SELECT* FROM TI;
crEate table TIM (d DATE,T TIME, DT DATETIME,TS TIMESTAMP); INSERT INTO TIM VALUES(NOW(),NOW(),NOW(),NULL); SELECT* FROM TIM;
这里需要注意的是MYSQL 只给第一个TIMESTAMP 设置了默认值是系统当前的DATETIME ,若有第二个 默认值是0;
如下测试:
crEate table TIM (ID INT(5),TS TIMESTAMP ,TS1 TIMESTAMP )engine=myisam; insert into tim (id) values (1); insert into tim (id) values (2); SELECT* FROM TIM;
但是,MySQL5.6.6开始这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option
(seedocumentation for more details).
关闭警告,在my.cnf中加入
[mysqld] explicit_defaults_for_timestamp=true重启MySQL后错误消失,这时TIMESTAMP的行为如下:
TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。
声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一个错误,如果严格SQL模式没有启用,该列会赋值为'0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)
字符串类型
VARCHAR 和 CHAR 的主要区别在于 VARCHAR 列中的值为可变长度的字符串,而CHAR 则为指定的固定长度的字符串;在检索时Char会将尾部的空格删除,而Varchar 会保留。
下面我们来测试一下:
create table string(v VARCHAR(8), C CHAR(8)); insert into string values ('abc ','abc '); SELECT* FROM String; select length(v),length(c) from string;
由上可验证我们之前说的咯 。
- binary和varbinary:与char 和 varchar 类似,不同的是其只存储二进制字符串,而不存储非二进制字符串
create table string(b binary(8)); insert into string values ('a'); SELECT* FROM String; select * ,hex(b),b='a',b='a/0',b='a/0/0' from string;
由上可以看出,binary值,在值的最后填充的是“0x00”
- 枚举类型:ENUM :它的值的范围在创建表的时候通过枚举的方式指定,0-255个成员需要1个字节存储,255-65535个成员需要两个字节存储,最多允许65535个成员。ENUM 有个特点,每次只能取一个成员,不能一次取多个值
然后我们来个小例子吧:
我们可以看出如果值是数字的话是不会报错的,而是直接截去,那么字母呢??
- set类型 与 enum类型一样也是一个字符串对象,里面可以包含0-64个成员。
1-8个成员的集合会占1个字节
9-16个成员的集合会占2个字节
17-24个成员的集合会占3个字节
25-32个成员的集合会占4个字节
33-64个成员的集合会占8个字节
set允许从集合中任选一个或多个元素进行组合,所以只要你的值在元素中可以组合出来,就能存入集合。
create table set1(s set('a','b','c','d','e','f')); insert into set1 values('a,b'),('a,b,c'),('a,b,a'),('a,b,a,c'),('1'); select * from set1;
由此可知,对于重复的('a,b,a'),a属于重复元素只会取一次。。。。