mysql支持的数据三大类型:
1.数值类型 2.整数类型 3.定点数类型
数值描述:
整数类型
字节 范围(有符号) 范围(无符号)
TINYINT 1 -128,127 0,255
SMALLINT 2 -32768,32767 0,65535
MEDIUMINT 3 -8388608,8388607 0,1677215
INT、INTEGER 4 -2147483648,2147483647 0,4294967295
BIGINT 8 -9223372036854775808,9223372036854775807 0,18446744073709551615
定点数类型
DECIMAL(M,D) 占M+2个字节
数据库类型的详细说明:
数值类型详细说明:
1>在整数类型中,按照取值范围和存储方式不同,分为tinyint、smallint、mediumint、int和bigint这5个类型。如果超出类型范围的操作
会发生“Out of range”错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围,最后根据确定的结果
慎重选择数据类型
2>对于整形数据,MySQL还支持在类型名称后面的小括号内指定显示宽度,例如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如
果不显示指定宽度则默认为int(11)。一般配合zerofill使用,顾名思义,zerofill就是用"0"填充的意思。设置了宽度限制后,如果插入大于宽度
限制的值,并不会有任何影响,还是按照类型的实际精度进行保存,这是,宽度格式实际已经没有意义,左边不会再填充任何的“0”字符。
create table t1(id1 int,id2 int(5));
insert into t1 values(1,1);
select * from t1;
alter table t1 modify id1 int zerofill;
alter table t1 modify id2 int(5) zerofill;
select * from t1;
insert into t1 values(1,111111);
select * from t1;
3>所有的整数类型都有一个可选属性UNSIGNED(无符号),如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取
值范围是正常值的下限取0,上限取原值的2倍。如果一个列指定为zerofill,则MySQL自动为该列添加UNSIGNED属性。
4>整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只能用于整数类型。
AUTO_INCREMENT值一般从1开始,每行增加1。在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列中当前最大值大1的值。
一个表中最多只能有一个AUTO_INCREMENT列。对于AUTO_INCREMENT列,应该定义为NOT NULL,并且定义为PRIMARY KEY或定义为UNIQUE键
比如:
create table t1(id int auto_increment not null primary key);或者:
create table t1(id int auto_increment not null,primary key(id));或者:
create table t1(id int auto_increment not null,unique(id));
5>对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种
表示。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
浮点数和定点数都可以用类型名称后面加(M,D)的方式来进行表示,(M,D)表示该值一共显示M位数字(整数位+小数位),其中D位位于小数
点后面,M和D又称为精度和标度。
对于浮点数,如果有精度和标度则MySQL保存值时会进行四舍五入,系统不会报错。
对于定点数,不指定精度和标度的情况下会默认为decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统会报错。对于
warning信息可以通过show warnings;查看!
create table t1(price decimal(5,2) default NULL);
2.日期类型
日期和时间类型 字节 最小值 最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP 4 19700101080001 2038年的某个时刻
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155
DATETIME是常用的日期类型
create table t1(dt datetime);
insert into t1 values(now());
3.字符串类型
字符串类型 描述
CHAR(M) M为0~255之间的整数,表示可以存M个字符
VARCHAR(M) M为0~65535之间的整数,表示可以存M个字符
TINYTEXT 允许长度0~255字符
TEXT 允许长度0~65535字符
MEDIUMTEXT 允许长度0~167772150字符
LONGTEXT 允许长度0~42949667295字符
BINARY(M) 允许长度0~M个字节的定长字节字符串(类似于CHAR类型,但保存二进制字节字符串而
不是非二进制字符串)
VARBINARY(M) 允许长度0~M个字节的变长字节字符串类型类似于VARCHAR类型,但保存二进制字节字 符串而不是非二进制字符串。
TINYBLOB 允许长度0~255字节的BLOB列(保存二进制字节字符串)
BLOB 允许长度0~65535字节的BLOB列(保存二进制字节字符串)
MEDIUMBLOB 允许长度0~167772150字节的BLOB列(保存二进制字节字符串)
LONGBLOB 允许长度0~4294967295字节的BLOB列(保存二进制字节字符串)
ENUM 枚举类型
SET SET类型
字符串类型详细说明:
1)char和varchar类型
char与varchar很类似,都用来保存MySQL中较短字符串。
区别:char列的长度固定位创建表时声明的长度,长度可以为0~255的任何值;
varchar列中的值为可变长字符串,长度可以指定为0~65535(MySQL5.0.3版本以前为0~255)之间的值。
在检索时,char列删除尾部的空格,而varchar则保留这些空格。
create table t1(v varchar(4),c char(4));
insert into t1 values('ab ','ab ');
select length(v),length(c) from t1;
select concat(v,'+'),concat(c,'+') from vc;
选择:由于char是固定长度,所以它的处理速度比varchar快,但是缺点是浪费存储空间。所以对于那些长度变化不大的数据可以选择此列
2)text类型
保存少量字符串的时候,我们会选择char或者varchar,保存大文本的时候通常会选择使用text。
3)blob类型
blob类型也是用来保存比较大量的字符串的名单是blob类型是用来保存二进制数据的比如照片。
2)ENUM类型
枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节存储;对于255~65535个成员,需要2个
字节存储。最多有65535个成员。
create table t1(flag enum('a','b','c','d'));
insert into t1 values('a'),('a'),('f');
往enum类型里存储数据是忽略大小写的,对于插入不在enum指定范围内的值时,并没有返回警告,而是插入了enum的第一个值。
另外enum类型只允许从值集合中选取单个值,而不能一次取多个值
3)SET类型
set和enum类型非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员的不同,存储上也有所不同。
1~8成员的集合,占1个字节
9~16成员的集合,占2个字节
17~24成员的集合,占3个字节
25~32成员的集合,占4个字节
33~64成员的集合,占8个字节
create table t1(flag set('a','b','c','d'));
insert into t1 values('a,b'),('a,d,a');
SET类型可以从允许值集合中选择任意1个或多元素进行组合,所以对于输出的值只要在允许的组合范围内,都可以正确地注入到set类型的
列中。
对于超出允许值范围的值,将不允许注入,对于包含重复的成员的集合将只取一次进行注入。
使用FIND_IN_SET函数对set类型的数据进行查询是比较好的选择!