按照官方的文档(8.0) 分析,MySQL的数据类型大概可以分为五类:数值数据类型、日期和时间数据类型、字符串数据类型、空间数据类型、JSON数据类型
1、数值数据类型
1.1、整数
MySQL支持SQL表中整数intege
r(int)和smallint
。作为一个可扩展标准,MySQL也支持整数tinyint
、mediumint
和bigint
。
-
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
。默认值为0decimal
的值使用二进制格式存储,该格式将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 |
浮点数可以和定点数一样指定m
和d
,但是为了保证最大可能的可移植性,需要使用浮点数存储的代码应使用float
或double precision
,不规定精度或位数。
1.4、位类型
- 位类型(
bit
),它是用来存放二进制数据的,bit(1)
表示存储长度为1位的二进制数据。超出存储长度会被直接截取。取值范围[bit(1), bit(64)]
2、日期和时间数据类型
- 日期和时间数据类型用于表示时间值
date
、time
、datetime
、timestamp
和year
。 -
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、字符串类型
-
字符串数据类型
char
、varchar
、binary
、varbinary
、blob
、text
、enum
和set
。类型 最大长度(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
(binary
、varbinary
)和(char
、varchar
)类似,不同的是它们存储二进制字节字符串而不是字符串。
-
binary(n)
若存入字符数小于n
,默认在后面补充0x00
,查询的时候再去掉。
3.3、text和blob
-
blob
是一个二进制大对象,可以容纳可变数量的数据。tinyblob
、blob
、mediumblob
和longblob
这四个blob
类型。仅在它们可以保存的值的最大长度上有所不同。 -
text
的四个类型tinytext
、text
、mediumtext
和longtext
和blob
的四种类型相对应。 -
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
元素构成的几何对象集合。
本文链接:MySQL的数据类型