数值型
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | |
|---|---|---|---|---|
| 小整数值 | tinyint | 1 字节 | (-128,127) | (0,255) |
| 大整数值 | smallint | 2 字节 | (-32768,32767) | (0,65535) |
| 大整数值 | mediumint | 3 字节 | (-8388 608,8388607) | (0,16777215) |
| 大整数值 | int 或 integer | 4 字节 | (-2147483648,2147483 647) | (0,4294967295) |
| 极大整数值 | bigint | 8 字节 | (-9233372036854775808,9223372036854775807) | (0,18446744073709551615) |
| 单精度浮点数值 | float | 4 字节 | (-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466351E+38) | 0,(1.175494351E-38,3.402823466E+38) |
| 双精度浮点数值 | double | 8 字节 | (-1.7976931348623157E+308,-2.2250738585072014 E-308),0, (2.2250738585072014E-308,1.7976931348623157E+308) |
0,(2.2250738585072014 E-308, 1.7976931348623157E+308) |
- 在计算机中,有正负符号的数值,称之为有符号类型,无正负符号的数值,称之为无符号类型,简单的理解为就是:有符号值可以表示负数,0以及正数 ,无符号值只能为0或正数;
如果没有指定unsigned关键字,那么就是有符号的,我们只需要知道有符号数可以表示负数,无符号数只能为非负数即可!
整型
数据类型描述使用以下约定:
M 表示整数类型的最大显示宽度,对于浮点和定点类型, M表示的是可以存储的总位数(精度),对于字符串类型, M表示的是最大长度,允许的最大值M一般取决于数据类型;
- D 适用于浮点和定点类型,并指示小数点后面的位数,最大可能值为30,但不应大于 M-2;
- [ ] 表示类型定义的可选部分;
创建一个表:

type 中每个字段后面都有一个括号,里面的数值实际上是字段的显示宽度(M值),也就是结果查询出来显示的宽度,默认最大显示宽度为255,显示宽度与类型可包含的值的范围无关;
我们在创建表的时候并没有指定字段类型的显示宽度,那么,默认的显示宽度则是该字段类型最大的显示宽度:
例如:字段a的显示宽度为4,是因为tinyint有符号值的范围是-128到127, -128的长度为4(负号、1、2、8共四位),所以默认的显示宽度最大为4,其他的以此类推;
下面再新建一个表,将字段a的修改为无符号类型(指定unsigned关键字)的,再看看a字段的默认显示宽度:
可以看到,默认显宽度就变成3了,因为无符号的tinyint的值范围为0-255,没有负号,所以最多只有3位;
浮点类型
float [(M,D)] [unsigned] [zerofill]
一个小的(单精度)浮点数:允许值是-3.402823466E+38 到 -1.175494351E-38,0以及1.175494351E-38到3.402823466E+38,M是总位数,D是小数点后面的位数;
double [(M,D)] [unsigned] [zerofill]
正常大小(双精度)浮点数:允许值是-1.7976931348623157E+308到-2.2250738585072014E-308,0以及2.2250738585072014E-308到1.7976931348623157E+308,M是总位数,D是小数点后面的位数;
创建一个表:
我们指定a字段为FLOAT类型,总长度为3,小数点后两位为2,b字段为DOUBLE类型,总长度为5,小数点后两位长度为3,然后插入数据:
可以看到,我们给a字段的值是1.123,但是只存进去了1.12,浮点数存在精度丢失的问题,如果涉及到小数运算,尽量不要用浮点型;
定点类型
decimal [(M,D)] [unsigned] [zerofill]
常用于存储精确的小数,M是总位数,D是小数点后的位数;
- 小数点和负数(- 符号)不计入M,如果D为0,则表示没有小数点或小数部分;
- 最大位数M为65,最大支持小数D为30,如果D省略,则默认值为0,如果M省略,则默认值为10,M的范围是1到65,D范围为0到30,且不得大于M;
创建表,先不指定M和D,可以看到,默认的总长度(M)为10,小数点位数(D)默认为0
插入一条数据,可以看到,存进去的数值被四舍五入了,也就是说,DECIMAL也存在在存储时精度丢失的问题.
上面的warning是超出范围和溢出处理产生的告警:
- 当MySQL将值存储在超出列的数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:
- 如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败;
- 如果没有启用限制模式,MySQL会将值截断到列数据类型范围的相应端点,并存储结果值,并产生一个警告;

字符串型
| 用途 | 类型 | M的意思 | 特点 | 大小 |
|---|---|---|---|---|
| 定长字符串 | char[(M)] | 最大的字符数, 可以省略, 默认为1 | 固定长度的字符 | 0 - 255字节 |
| 变长字符串 | varchar(M) | 最大的字符数, 不可以省略 | 可变长度的字符 | 0 - 65535 字节 |
| 短文本字符串 | tinytext | 0 - 255字节 | ||
| 长文本数据 | text | 0 - 65535字节 | ||
| 中等长度文本数据 | mediumtext | 0 - 16777215字节 | ||
| 极大文本数据 | longtext | 0 - 4294 967295字节 | ||
| 不超过255个字符的二进制字符串 | tinyblob | 0 - 255字节 | ||
| 二进制形式的长文本数据 | blob | 0 - 65535字节 | ||
| 二进制形式的中等长度文本数据 | mediumblob | 0 - 16777215字节 | ||
| 二进制形式的极大文本数据 | longblob | 0 - 4294967295字节 |
CHAR [(M)]
- 它是一个固定长度的字符串,存储时始终用空格填充指定长度,M表示以字符为单位的列长度,M的范围为0到255,如果M省略,则长度为1,存储时占用M个字节;
- char(n) 若存入字符数 < n,则以空格补于其后,查询之时再将空格去掉,所以char类型存储的字符串末尾不能有空格,varchar不限于此;
- char(n) 为固定长度,char(4)不管是存入几个字符,都将占用4个字节;
- char类型的字符串检索速度要比varchar类型的快;
VARCHAR (M)
- 它是一个可变长度的字符串,M 表示字符的最大列长度,M的范围是0到65535,存储时占用L+1(L<=M,L为实际字符的长度)个字节;
- varchar(n) 存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节;
- varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节;
- varchar可直接创建索引,text创建索引要指定前多少个字符,varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用;
TEXT [(M)]
- text类型不能有默认值,占用L+2个字节,L<2^16
TINYTEXT [(M)]
- 不能有默认值,占用L+1个字节,L<2^8
MEDIUMTEXT [(M)]
- 不能有默认值,占用L+3个字节,L<2^24
LONGTEXT [(M)]
- 不能有默认值,占用L+4个字节,L<2^32
ENUM (‘value1’,’value2’,…)
- ENUM是一个字符串对象,其值从允许值列表中选择,它只能有一个值,从值列表中选择,最多可包含65,535个不同的元素
SET (‘value1’,’value2’,…)
- 字符串对象,该对象可以有零个或多个值,最多可包含64个不同的成员
char和varchar
它们存储时占用的长度是不一样的,char类型不管存储的值的长度是多少,都会占用M个字节,而VARCHAR则占用实际长度+1个字节;
由于CHAR的查询效果要高于VARCHAR,所以说,如果字段的长度能够确定的话,比如手机号,身份证号之类的字段,可以用CHAR类型,像地址,邮箱之类的就用VARCHAR;

text
TEXT系列的存储范围比VARCHAR要大,当VARCHAR不满足时可以用TEXT系列中的类型;
需要注意的是:TEXT系列类型的字段不能有默认值,在检索的时候不存在大小写转换,没有CHAR和VARCHAR的效率高;
ENUM(枚举类型)

SET
在ENUM中我们只能从允许值列表中的数据给字段插入一个值,而在SET类型中,可以给字段插入多个值
时间型
| 用途 | 类型 | 大小 | 格式 |
|---|---|---|---|
| 日期值 | date | 3 | 1999-12-31 |
| 时间值或持续时间 | time | 3 | 11:30:00 |
| 年份值 | year | 1 | 2020 |
| 混合日期和时间值 | datetime | 8 | 1999-12-31 23:59:59 |
| 混合日期和时间值,时间戳 | timestamp | 4 | 1970-01-01 00:00:00/2038 (结束时间是第2147483647秒,北京时间2038-1-19 11:14:07,格林尼治时间2038年1月19日凌晨03:14:07) |
TIME 范围:’-838:59:59.000000’ 到 ’838:59:59.000000’
DATE 范围: ‘1000-01-01’ 到 ‘9999-12-31’
DATETIME 日期和时间组合,范围是: ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’
TIMESTAMP 时间戳,范围是:’1970-01-01 00:00:01.000000’UTC 到 ’2038-01-19 03:14:07.999999’UTC
YEAR 范围是:1901 到 2155.
TIME
我们可以看到TIME的存储范围是’-838:59:59’ 到 ‘838:59:59’,因为TIME类型不仅可以用于表示一天中的时间,还可以用于表示两个事件之间的经过时间或时间间隔;
TIME的完整的显示为:D HH:MM:SS
D:表示天数,当指定该值时,存储时小时会先乘以该值
HH:表示小时
MM:表示分钟
SS:表示秒
创建表,插入数据,查看表,查看数据
DATE
DATETIME
TIMESTAMP
TIMESTAMP和DATETIME使用上差不多,但是范围相对较小
创建表,插入数据,查看表,查看数据
YEAR
创建表,插入数据,查看表,查看数据
