数值型

类型 大小 范围(有符号) 范围(无符号)
小整数值 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;
  • [ ] 表示类型定义的可选部分;

创建一个表:
4, 数据类型 - 图1
4, 数据类型 - 图2
type 中每个字段后面都有一个括号,里面的数值实际上是字段的显示宽度(M值),也就是结果查询出来显示的宽度,默认最大显示宽度为255,显示宽度与类型可包含的值的范围无关;
我们在创建表的时候并没有指定字段类型的显示宽度,那么,默认的显示宽度则是该字段类型最大的显示宽度:
例如:字段a的显示宽度为4,是因为tinyint有符号值的范围是-128到127, -128的长度为4(负号、1、2、8共四位),所以默认的显示宽度最大为4,其他的以此类推;

下面再新建一个表,将字段a的修改为无符号类型(指定unsigned关键字)的,再看看a字段的默认显示宽度:
4, 数据类型 - 图3
可以看到,默认显宽度就变成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是小数点后面的位数;
创建一个表:
4, 数据类型 - 图4
我们指定a字段为FLOAT类型,总长度为3,小数点后两位为2,b字段为DOUBLE类型,总长度为5,小数点后两位长度为3,然后插入数据:
可以看到,我们给a字段的值是1.123,但是只存进去了1.12,浮点数存在精度丢失的问题,如果涉及到小数运算,尽量不要用浮点型;
4, 数据类型 - 图5

定点类型

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
4, 数据类型 - 图6
插入一条数据,可以看到,存进去的数值被四舍五入了,也就是说,DECIMAL也存在在存储时精度丢失的问题.
4, 数据类型 - 图7
上面的warning是超出范围和溢出处理产生的告警:

  • 当MySQL将值存储在超出列的数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:
    • 如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败;
    • 如果没有启用限制模式,MySQL会将值截断到列数据类型范围的相应端点,并存储结果值,并产生一个警告;

image.png

字符串型

用途 类型 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;
image.png
4, 数据类型 - 图10

text

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

ENUM(枚举类型)

4, 数据类型 - 图12

SET

在ENUM中我们只能从允许值列表中的数据给字段插入一个值,而在SET类型中,可以给字段插入多个值
4, 数据类型 - 图13

时间型

用途 类型 大小 格式
日期值 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:表示秒

创建表,插入数据,查看表,查看数据
image.png

DATE

创建表,插入数据,查看表,查看数据
image.png

DATETIME

创建表,插入数据,查看表,查看数据
image.png

TIMESTAMP

TIMESTAMP和DATETIME使用上差不多,但是范围相对较小
创建表,插入数据,查看表,查看数据
image.png

YEAR

创建表,插入数据,查看表,查看数据
image.png