数值类型:包括整型和浮点型,整型(tinyint,smallint,mediumint,int,bigint),浮点型(float,double)。
日期类型:year,time,date,datetime,timestamp
字符串类型:char,varchar,binary,varbinary,blob,text,enum,set。
tinyint(1字节),smallint(2字节),mediumint(3字节),int(4字节),bigint(8字节)
tinyint的一个字节长度代表8位,如果是无符号整型,那么最小的二进制数是0000 0000=0,最大的数是1111 1111=2的8次方-1=255,即tinyint的无符号取值范围是(0 ~ 255)。如果是有符号整型,那么第一位二进制要当做符号位,最小的二进制数位0111 1111=-(2的7次方-1)=(-127),最大的数是1111 1111=(2的7次方-1)=127。这种情况下由于存在0000 0000和1000 0000,即正零和负零两种情况存在,所以会把其中一个0当做-128。于是tinyint的有符号整型的范围就是(-128 ~ 127)
依次类推,可以得到如下表格
数据类型 无符号整型 有符号整型
tinyint(1字节---8位) 0 ~ 2的8次方-1 -2的7次方  ~  2的7次方-1
smallint(2字节---16位) 0 ~ 2的16次方-1 -2的15次方  ~  2的15次方-1
mediumint(3字节---24位) 0 ~ 2的24次方-1 -2的23次方  ~  2的23次方-1
int(4字节---32位) 0 ~ 2的32次方-1 -2的31次方  ~  2的31次方-1
bigint(8字节---64位) 0 ~ 2的64次方-1 -2的63次方  ~  2的63次方-1
 
 
 
 
 
 
 
注:有时候我们定义int(11),这个11指定的是宽度。所谓宽度就是显示在前台的宽度,int的取值范围依然是不变的。举个例子,一张表中的年龄字段age,定义为tinyint unsigned恐怕是最合适的了。但是这个tinyint的宽度我们应该写多少了?1,2,3,4中的哪一个?我觉得最好还是2,因为大多数人的年龄在10-99这个阶段,用2个宽度最好。如果用3个宽度,就浪费了很多空间,因为3个宽度是需要空格来挤占位置,是需要空间的。
 
浮点型:float,double,decimal
float(5,2)其中5表示数字总体宽度,2表示精度。如插入1.34567,则在数据库中显示为1.35.
 
insert into t_float values(789.3452345,45809.23847234,5438957234.2);

 

日期与时间类型datetime,date,timestamp,time,year。当只需要记录年份信息的时候,可以用year类型,没有必要用date。
类型名称 日期范围 长度
year 1901-2155 1字节
time -838:59:59 ~ 838:59:59 3字节
date 1000-01-01 ~ 9999-12-3 3字节
datetime 9999-12-31 23:59:59 8字节
timestamp 1970-01-01 00:00:01 4字节

 

 

 

 

字符串类型:
varchar,blob,text类型是边长类型,对于其存储需求取决于列值的实际长度,而不是取决于类型的最大可能尺寸。例如varchar(10)能保存最大长度为10个字符的一个字符串,实际存储需要是字符串的长度L,加上1个字节来记录字符串的长度。对于字符'abcd',长度是4,但是还需要1个字节来记载长度。所以就会算成5个字节。
char类型的最大长度是255,varchar的最大长度是65535.char类型占用的存储是确定的,例如char(4),不管他插入怎样的字符串,空也好,10个字符也好(会截断),都是4个字节。varchar(4)存储空间会根据实际长度加1,例如''空字符串插入则占用1个字节,‘a’插入会占用2个字节,'abcd'插入会占用5个字节,'abcdefg'插入只会插入'abcd'会占用5个字节。
类型 长度
tinytext 变长,2的8次方-1个字节
text 变长,2的16次方-1个字节
mediumtext 变长,2的24次方-1个字节
longtext 变长,2的32次方-1个字节
对于enum类型的字段,如下图所示,分为ABCDE五级,红框中的为插入失败,so只可以插入ABCDE和NULL六种情况,其他的都会失败

 

对于set字段类型:
alter table t_other add column qualification set('工程师','建筑师','会计师','律师');
update t_other set qualification=('工程师,建筑师') where score=51;
update t_other set qualification=('工程师,工程师') where score=64;