MySQL的数据类型
文章目录
按照官方的文档(8.0) 分析,MySQL的数据类型大概可以分为五类:数值数据类型、日期和时间数据类型、字符串数据类型、空间数据类型、JSON数据类型
1、数值数据类型
1.1、整数
- MySQL支持SQL表中整数
integer(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。默认值为10d是小数点右边的位数(小数位数)。范围是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 |
浮点数可以和定点数一样指定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元素构成的几何对象集合。