MYSQL支持多种类型,大致分为三类,数值、日期/时间、字符串(字符)类型。
数值型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
tinyint | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
smallint | 2 Bytes | (-32768,32768) | (0,65535) | 大整数值 |
mediumint | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
int 或 integer | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
bigint | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
float | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度,浮点数值 |
double | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度,浮点数值 |
decimal | 对于decimal(M,D),如果M>D,为M+2,否则为D+2。 | 依赖M和D | 依赖M和D | 小数值 |
Attention:
- int类型,占用字节数为4byte,学过计算机原理的同学应该知道,字节(byte)并非是计算机存储的最小单位,还有比字节(byte)更小的单位, 也就是位(bit),一个位就代表一个0或1;8个位组成一个字节;一般字节用大写B来表示byte,位用小写b来表示bit。(计算机存储单位的换算: 1B=8b 1KB=1024B 1MB=1024KB)那么根据int类型允许存储的字节数是4个字节,我们就能换算出int unsigned(无符号)类型的能存储的最小值为0, 最大值为4294967295(即4B=32b, 最大值即为32个1组成,即4294967295换算成二进制则是32个1)。
- int()中M默认值为11,int() unsigned中M的默认值为10, int(1)、int(2)、int(4)、int(8),不管是M是多少,int类型都是占4个字节,存储范围也一样。例如插入123456789时都可以,虽然超过指定长度,查询也能显示出来。利用zerofill可以显示出int(M)的不同,当使用ZEROFILL时,默认会自动加unsigned(无符号)属性。比如 INT(3) ZEROFILL,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0。zerofill比较常用的场景是月份或日期前补0。
- float和double两者主要区别就是精度,即小数点后保存位数多少。
- 经测试float默认只保存6位(除去小数点),如果超过6位,则四舍五入,所以float存储的数据是不精确的,只是近似值。double能保存16位左右,测试不太稳定。
- float默认大小为24位数字,精度大约7位数字(经测试为6位),当设置M大小大于24时,自动转换为double类型;同时设置M和D时不进行自动转换,如float(25,2)类型就是float(25,2)。
- float(M,D)中M表示所有数字长度,D表示小数点后的数字长度,float的M范围为1~255,D最大限制不能超过30。double(M,D)与float(M,D)用法类似。
- decimal(M,D),M的范围是1-65,默认值是10,表示所有有效数字长度,D的范围是0-30,默认值是0,表示小数点后的数字长度。M≥D,例如decimal(5,2)该字段存储的范围是-999.99 ~ 999.99。小数位超出会截断,产生告警,并按四舍五入处理。
字符型
类型 | 大小 | 用途 |
---|---|---|
char | 0~255 Bytes | 定长字符串 |
varchar | 0~65535 Bytes | 变长字符串 |
tinyblob | 0~255 Bytes | 不超过255个字符的二进制字符串 |
tinytext | 0~255 Bytes | 短文本字符串 |
blob | 0-65 535 Bytes | 二进制形式的长文本数据 |
text | 0-65 535 Bytes | 长文本数据 |
mediumblob | 0-16 777 215 Bytes | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215 Bytes | 中等长度文本数据 |
longblob | 0-4 294 967 295 Bytes | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295 Bytes | 极大文本数据 |
Attention:
- char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。char默认为1,varchar无默认,必须设置为varchar(n)。创建类型char(10),插入值’abc’,占用空间一样是10个字符,即剩余7个字符用空格填充,而varchar(10),插入值’abc’,最大占用空间为10个字符,实际占用空间是值字符串长度+1或2。
- binary 和 varbinary 类似于 char 和 varchar,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。
- BLOB 是一个二进制大对象,可以容纳可变数量的数据。text 不可以有默认值,其最大长度是 2 的 16 次方-1。
日期/时间型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
date | 3 Bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 Bytes | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
year | 1 Bytes | 1901/2155 | YYYY | 年份值 |
datetime | 8 Bytes | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
timestamp | 4 Bytes | 1970-01-01 00:00:00/2038,结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |