数据类型

/*
mysql支持的数据类型
数值类型:
     数据类型   字节数
     tinyint     1
     smallint    2
     mediumint   3
     int、integer  4
     bigint        8
浮点类型:
     float         4
     double 8
定点值类型
     dec(m,d),decimal(m,d)  m+2  最大取值范围和double相同,给定decimal的有效取值范围由m和d决定
位类型
   bit(m)       1~8         存放的是二进制数据。所以m的范围为 1~64                                
*/
--对于整形数据,mysql支持在类型名称后面的小括号内指定宽度。例如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显示指定宽度默认为int(11)。一般配合zerofill使用,zerofill就是用0填充的意思,在数字位数不够的空间用字符0填满

create table t1 (id1 int,id2 int(5));-- 建表t1,两个字段指定数值宽度为int和int(5)
insert into t1 values (1,1); -- 插入数值,没发现格式异常
alter table t1 modify id1 int zerofill;
alter table t1 modify id2 int(5) zerofill;
select * from t1;
--可以发现,在数值前面用字符0填充了剩余的宽度。设置宽度限制后,如果设置大于宽度限制的值,会不会截断或者插入不进去?答案是坑定的:不会对插入的数据有任何影响,还是按照类型的实际精度进行保存。这时候宽度格式已经失去了意义
insert into t1 values (1,1111111);

-- 所有的整数类型都有一个可选属性 unsigned(无符号)。就是将二进制保存的符号位当成正常位使用,所以它的取值范围是0~正常值的2倍。注意:如果一个列指定为zerofill,则mysql自动为该列增加unsigned属性
insert into t1 values (1,-123);-- 这里就不能插入负数了

--整数类型另一个属性auto_increment属性很熟了,就展示个例子吧
create table ai(id int auto_increment not null unique);
insert into ai values ();
select * from ai;
drop table ai;
/*
对于小数的表示,mysql分为两种方式:浮点数和定点数。浮点数包括单精度float和双精度double,定点数只有decimal一种表示形式。定点数在mysql内部以字符串形式存放,比浮点数更加精确,适合用来表示货币等精度高的数据
浮点数和定点数都可以使用类型名称后面加“(M,D)”的形式表示。(M,D)表示该值一共显示M位数字(整数位+小数位),D位位于小数点后面,M和D又被称为精度和标度。小数部分超过标度四舍五入。浮点数后面加精度和标度识一种非标准用法,如果要用于数据库的歉意最好不要这样使用
float和double不指定精度时会按照实际精度来显示,而decimal不指定精度时,默认的整数位是10,小数位是0
注意:浮点数超过精度时插入不进去的
*/
drop table t1;
create table t1
(
 id1 float(5,2) default null,
 id2 double(5,2) default null,
 id3 decimal(5,2) default null
);
--id1,id2分别插入数据1.234,id3字段插入1.23
insert into t1 values (1.234,1.234,1.23); -- id1和id2标度限制变成为1.23
--都插入1.234
insert into t1 values (1.234,1.234,1.234); 
select * from t1;
--将精度、标度全部去掉再加入数据1.23
truncate table t1;
alter table t1 modify id1 float;
alter table t1 modify id2 double;
alter table t1 modify id3 decimal;
insert into t1 values (1.23,1.23,1.23);
insert into t1 values (1.23,567542.12,1.23);-- 跟整型不一样,超过精度插不进

--对于bit(位)类型,用于存放字段位,bit(m)可以用来存放多位二进制数,m范围从1~64,如果不写默认为1位。对于位字段,直接使用select命令将不会看到结果,可以使用bin()(显示为二进制格式)或者hex(显示为16进制格式)函数来读取,我使用客户端可以正常显示二进制
create table t2(id bit(2));
insert into t2 values (3);
insert into t2 values(1);
select * from t2;
select bin(id),hex(id) from t2;
drop table t2;
--插入二进制,首先转换成二进制,如果位数允许,将成功插入;如果位数大于表定义的位数,则插入失败

/*
日期时间类型
日期和时间类型      字节      格式                        最小值
DATE                 4         yyyy-MM-dd                 1000-01-01
DATETIME             8         yyyy-MM-dd HH:MM:SS        1000-01-01 00:00:00
TIMESIMPLE           4         yyyyMMddHHMMSS             19700101080001
*/
create table t
(
 d date,
 t time,
 dt datetime
);
insert into t values(now(),now(),now());
drop table t;
select * from t;
--year类型主要用来表示年份,当只需要记录年的时候,year比date将更节省时间
create table t(y year);
insert into t values(2011);
/*
mysql以YYYY格式检索和显示year值,范围是1901~2155.当使用两位字符串表示年份的时候。其范围为00~99
00~69范围的值被转换为2000~2069范围的year值;70~99范围的值被转换为1970~1999范围的year值
YYYY-MM-DD HH:MM:SS或者YY-MM-DD HH:MM:SS格式的字符串,允许“不严格”语法,即任何标点符都可以被用来做日期部分或者时间部分的间隔符。如果日和月的值小于10,可以不需要指定两位数,如果时分秒的数值小于10也可以不指定两位数
*/

/*
字符串存储类型
*/
-- char和varchar很类似,都用来保存mysql中较短的字符串。两者的区别主要在于存储方式的不同:char列的长度固定为创建表时声明的长度,声明长度可以为0~255之间的任何值。varchar是可变字符,长度为0~255(mysql5,。0.3版本前)或者65535之间的值。
create table vc (v varchar(4),c char(4));
insert into vc values('ab','ab');
select length(v),length(c) from vc;
select concat(v,'+'),concat(c,'+') from vc;
drop table vc;
--binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串而不包含非二进制字符串
--enum类型。枚举类型,它的值范围需要在创建表的时候通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储,对于255~62235个成员需要两个字节存储。最多允许有62235个成员
create table t (gender enum('M','F'));
insert into t values ('M');
insert into t values ('f');
insert into t values (null);
insert into t values ('c');--无法插入
insert into t values ('1');
insert into t values ('2');
insert into t values ('3');-- 无法插入
select * from t;
-- 可以发现,枚举类型插入数据不区分大小写,但是保存的数据是按照枚举中元素保存的。枚举插入有两种方式,一种是插入枚举中指定元素,而是插入枚举中指定元素下标,注意,下标从1开始
/*
set数据类型和枚举有点类似,也是一个字符串对象,根据成员的不同,存储上也有所不同。
1~8个成员的集合,占1个字节  9~16个成员的集合,占2个字节  17~24个成员的集合,占3个字节 25~32个成员的集合,占4个字节 33~54个成员的集合,占8个字节
除了存储外,set和enum最主要的区别在于set类型一次可以选取多个成员,而enum只能选取一个
*/
create table t (col set('a','b','c','d'));
insert into t values ('a,b'),('a,d,a'),('a,b'),('a,c'),('a');
select * from t;
insert into t values ('e');-- 插入失败
insert into t values ('a,b,e');-- 插入失败
--set的类型可以允许值集合中旅选择一个或多个元素进行组合,所以对于输入的值只需要是在允许的值的组合范围内,都可以正确地追到set集合的列中。对于超出范围的值无法注入,如果注入的集合有重复元素,自动去重复,按出现第一次算
原文地址:https://www.cnblogs.com/aigeileshei/p/5595661.html