mysql学习笔记(二) 数据类型

  • 数据类型

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));
即   create 表名(列名1 数据类型1,类名2 数据类型2...);
  • 向表中插入数据 insert into grade values(321,86);

即  insert into 表名(数值1,数值2...)

  • 简单的数据查询:mysql> select *from grade; //查询表中所有数据
  • 修改表中列的数据类型 alter table grade modify number int zerofill;
即: alter 表名 modify 列名 要更改的数据类型

下面我们来看看是不是以“ ”填充

若使用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属于重复元素只会取一次。。。。




猜你喜欢

转载自blog.csdn.net/fengkaungdewoniu/article/details/79943565
今日推荐