数值类型:包括整型和浮点型,整型(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;