/*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.23insert into t1 values (1.234,1.234,1.23); -- id1和id2标度限制变成为1.23--都插入1.234insert into t1 values (1.234,1.234,1.234); select * from t1;--将精度、标度全部去掉再加入数据1.23truncate 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-01DATETIME 8 yyyy-MM-dd HH:MM:SS 1000-01-01 00:00:00TIMESIMPLE 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~9900~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集合的列中。对于超出范围的值无法注入,如果注入的集合有重复元素,自动去重复,按出现第一次算