按照官方的文档(8.0) 分析,MySQL的数据类型大概可以分为五类:数值数据类型、日期和时间数据类型、字符串数据类型、空间数据类型、JSON数据类型

1、数值数据类型

1.1、整数

  • MySQL支持SQL表中整数integer(int)和smallint。作为一个可扩展标准,MySQL也支持整数tinyintmediumintbigint
  • MySQL支持的整数存储空间和范围
类型 存储空间(bytes) 有符号范围 无符号范围
tinyint 1 [-128, 127] [0, 255]
smallint 2 [-32768, 32767] [0, 65535]
mediumint 3 [-8388608, 8388607] [0, 16777215]
int 4 [-2147483648, 2147483647] [0, 4294967295]
bigint 8 [-263, 263-1] [0, 264-1]

1.2、定点数

定点数 自变量的值范围可以表示为:DECIMAL(M,D)

  • m是最大位数(精度)。范围是1到65。默认值为10
  • d是小数点右边的位数(小数位数)。范围是0到30,并且不能大于m。默认值为0

decimal的值使用二进制格式存储,该格式将9个十进制数字打包为4个字节。每个值的整数和小数部分的存储要求分别确定。九个数字的每个倍数需要4个字节,其余的剩余数字则需要4个字节的一部分。

剩余数字 所需字节数
0 0
1–2 1
3–4 2
5–6 3
7–9 4
  • decimal(65, 0)时,支持最大范围[-1065-1, 1065-1]

1.3、浮点数

浮点数有float(单精度)和double(双精度)

类型 精度值 所需字节字节
float 0~23 4
double 24~53 8

浮点数可以和定点数一样指定md,但是为了保证最大可能的可移植性,需要使用浮点数存储的代码应使用floatdouble precision,不规定精度或位数。

1.4、位类型

  • 位类型(bit),它是用来存放二进制数据的,bit(1)表示存储长度为1位的二进制数据。超出存储长度会被直接截取。取值范围[bit(1), bit(64)]

2、日期和时间数据类型

  • 日期和时间数据类型用于表示时间值datetimedatetimetimestampyear
  • timestamp自动设置为最新修改的日期和时间,定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,存放这条记录最后被修改的时间
  • 每个时间类型有一个有效值范围和一个”零”值。
类型 字节数 取值范围 零值
year 1 1901~2155 0000
date 4 1000-01-01~9999-12-31 0000:00:00
time 3 -838:59:59~838:59:59 00:00:00
datetime 8 1000-01-01 00:00:00~9999-12-31 23:59:59 0000-00-00 00:00:00
timestamp 4 1970-01-01 08:00:01~2038-01-19 11:14:07 00000000000000

3、字符串类型

字符串数据类型charvarcharbinaryvarbinaryblobtextenumset

类型 最大长度(bytes) 说明
char 255 定长字符串
varchar 65535 变长字符串
binary 255 二进制定长字符串
varbinary 65535 二进制变长字符串
tinytext 255 短文本字符串
text 65535 长文本数据
mediumtext 224-1 中等长度文本数据
longtext 232-1 极大文本数据
tinyblob 255 二进制短文本字符串
blob 65535 二进制长文本数据
mediumblob 224-1 二进制中等长度文本数据
longblob 232-1 二进制极大文本数据

3.1、char和varchar

  • char(n) 若存入字符数小于n,默认在后面补充空格,查询的时候再将空格去掉。所以char类型存储的字符串末尾不能有空格。
  • varchar的值是可变长度的字符串。长度可以指定为0到65535之间的值。有效最大长度 取决于最大行大小和所使用的字符集。
    官方示例:

|值| char(4)| 需要存储| varchar(4)| 需要存储|
|–|–|–|–|
|’’|’    ’|4字节|’’|1个字节|
|’ab’|’ab  ’|4字节|’ab’|3个字节|
|’abcd’|’abcd’|4字节|’abcd’|5字节|
|’abcdefgh’|’abcd’|4字节|’abcd’|5字节|

  • 显示在表最后一行中的值仅在不使用严格的SQL模式 时才适用,如果启用了严格模式,则会报错。

3.2、binary和varbinary

(binaryvarbinary)和(charvarchar)类似,不同的是它们存储二进制字节字符串而不是字符串。

  • binary(n) 若存入字符数小于n,默认在后面补充0x00,查询的时候再去掉。

3.3、text和blob

  • blob是一个二进制大对象,可以容纳可变数量的数据。tinyblobblobmediumbloblongblob这四个blob类型。仅在它们可以保存的值的最大长度上有所不同。
  • text的四个类型tinytexttextmediumtextlongtextblob的四种类型相对应。
  • blob值被视为二进制字符串(字节字符串)。它们具有binary字符集和排序规则,并且比较和排序基于列值中字节的数字值。
  • text值被视为非二进制字符串(字符字符串)。它们具有binary以外的字符集,并且根据字符集的排序规则对值进行排序和比较。

3.3、enum

enum是一个字符串对象,值是从允许输入的列表中选择的,这些值在表创建时在列规范中定义。

  • enum列表的最大数量为65535,每个值末尾的空格都会被删除。
  • enum列表有not null属性,其默认值为取值列表的第一个元素。
  • enum列表没有not null,则enum类型将允许插入null,并且null为默认值。
  • enum列表中的每个值独有一个顺序排列的编号,MySQL会存入这个编号而不是对应的值。

3.4、set

set是可以具有零个或多个值的字符串对象,这些值在表创建时在列规范中定义。

  • set的最大数量为64,每个值末尾的空格都会被删除。
  • 取多个元素时,不同元素用逗号隔开。
  • 大概可以理解为enum的多选版。

4、json数据类型

MySQL支持json定义的数据类型,该类型可有效访问json(JavaScript对象表示法)文档中的数据。

  • 自动验证存储在json列中的json文档。无效的文档会产生错误。
  • 查询性能的提升:查询不需要遍历所有字符串才能找到数据。
  • json存储的数据不能是null,只能是json格式的数据

5、空间数据类型

注:没有理解,拷贝部分官方的介绍。
空间数据类型有下面几种:

  • GEOMETRY: 是层次结构的根类。可以存储任何类型的几何值。其他单值类型(POINT, LINESTRING和POLYGON)将其值限制为特定的几何类型。
  • Point:(点)指的是代表坐标空间中单个位置的几何类。
  • Curve: (曲线)是一种1维几何对象,通常由一系列点表示。Curve的特殊子类定义了点之间的内插类型。Curve是一种非实例化类。
  • LineString: 是具有点之间线性内插特性的Curve
  • Surface: 是一种2维几何对象。它是一种非实例化类。其唯一的可实例化子类是Polygon。
  • Polygon: 是代表多边几何对象的平面Surface。它由单个外部边界以及0或多个内部边界定义,其中,每个内部边界定义为Polygon中的1个孔。
  • GeometryCollection: 是由1个或多个任意类几何对象构成的几何对象。
  • MultiPoint: 是一种由Point元素构成的几何对象集合。这些点未以任何方式连接或排序。
  • MultiCurve: 是一种由Curve元素构成的几何对象集合。MultiCurve是一种非实例化类。
  • MultiLineString: 是一种由LineString元素构成的几何对象集合。
  • MultiSurface: 是一种由Surface元素构成的几何对象集合。MultiSurface是一种非实例化类。其唯一的可实例化子类是MultiPolygon
  • MultiPolygon: 是一种由Polygon元素构成的几何对象集合。