1、数值型
整型
小数:定点型、浮点型
2、字符型
较短的文本:char、varchar
较长的文本:text、blob(较长的二进制数据)
3、日期型
<选择数据类型原则:越简单越好,能保存数值的类型越小越好>
一、整型
分类:tinyint、smallint、mediumint、int / integer、bigint
特点:
(1)如不设置有/无符号,默认为有符号。设置无符号需要添加 unsigned关键字
(2)如果插入的数值超出了整型的范围,会报out of range,并插入临界值
(3)如果不设置长度,会有默认的长度
长度代表显示的最大宽度,如果不够会用0在左边填充,但必须使用zerofill关键字搭配
使用zerofill后,默认为无符号型。
1、设置无符号和有符号
CREATE TABLE tab_int(
t1 INT, #有符号
t2 INT UNSIGNED #无符号
);
2、指定整型长度为显示的宽度,搭配zerofill关键字使用后,默认为无符号
CREATE TABLE tab_int(
t1 INT(7) ZEROFILL,
t2 INT(7) ZEROFILL
);
INSERT INTO tab_int VALUE(-123,123);
SELECT * FROM tab_int;
二、小数
1、浮点型
分类:float(M,D)、double(M,D)
2、定点型
分类:DEC(M,D) / DECIMAL(M,D)
特点:
(1)M:整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值或四舍五入
(2) M、D都可以省略
如果是Decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度
(3)定点型的精确度相对较高,如果要求插入数值的精度较高,则优先使用
1、M和D测试
CREATE TABLE tab_float(
f1 FLOAT(5,2),
f2 DOUBLE(5,2),
f3 DECIMAL(5,2)
);
INSERT INTO tab_float VALUES
(123.456,123.456,123.456),
(123.4,123.4,123.4),
(1523.4,1523.4,1523.4);
SELECT * FROM tab_float;
#若省略M、D
CREATE TABLE tab_float(
f1 FLOAT,
f2 DOUBLE,
f3 DECIMAL
);
INSERT INTO tab_float VALUES (1523.4243,1523.444,1523.415);
SELECT * FROM tab_float;
三、字符型
1、较短的文本
分类:char、varchar、enum(枚举)、set(集合) 、binary / varbinary(较短的二进制)
特点:
(1)写法:char(M)、varchar(M),M为最大字符数
char的M可省略,默认为1;varchar的M不可省略
(2)char代表固定长度的字符,varchar代表可变长度的字符
(3)char空间消耗较高,效率更高;varchar空间较节省,效率更低
eg1.枚举类型的使用
CREATE TABLE tab_char(
c1 ENUM('a','b','c')
);
INSERT INTO tab_char VALUES
('a'),('e'),('A'),('c');
SELECT * FROM tab_char;
eg2.集合类型的使用
CREATE TABLE tab_set(
c1 set('a','b','c','d')
);
INSERT INTO tab_set VALUES
('a,b'),('A,B,c'),('a,e'),('e,f');
SELECT * FROM tab_set;
2、较长的文本
分类:text、blob(较长的二进制数据)
四、日期型
分类:date、datetime、timestamp、time、year
date只保存日期,time只保存时间,year只保存年
datetime保存日期+时间,timestamp保存日期+时间
datetime和timestamp区别:
(1)timestamp支持的时间范围较小
(2)timestamp和实际时区有关,更能反映实际的日期,而datetime只能反映出插入时的当地时区
(3)timestamp的属性受MySQL版本和SQLMode的影响
#显示时区
SHOW VARIABLES LIKE 'time_zone';
eg1.设置时区为东九区
CREATE TABLE tab_date(
t1 DATETIME,
t2 TIMESTAMP
);
INSERT INTO tab_date VALUES(NOW(),NOW());
SET time_zone='+9:00';
SHOW VARIABLES LIKE 'time_zone';
SELECT * FROM tab_date;