MySQL 数据类型

2025年8月18日 | 阅读 10 分钟

数据类型指定了特定类型的数据,例如整数、浮点数、布尔值等。它还标识了该类型的可能值、可以在该类型上执行的操作以及该类型值的存储方式。在 MySQL 中,每个数据库表都有许多列,并且为每列都包含特定的数据类型。

我们可以通过以下特征来确定 MySQL 中的数据类型:

  • 它所表示的值的类型(固定或可变)。
  • 其存储空间占用取决于值是固定长度还是可变长度。
  • 其值是否可以索引。
  • MySQL 如何对特定数据类型的值进行比较。

MySQL 支持多种类别的许多 SQL 标准数据类型。它使用多种不同的数据类型,这些数据类型可分为以下几类:数值型、日期和时间型、字符串型、空间型和 JSON 数据类型。

要点

列中可以存储的值的类型由 MySQL 数据类型决定,这些数据类型会影响性能、索引、存储空间和比较。

  • 数值型、日期/时间型、字符串型、BLOB 型、空间型和 JSON 数据类型都属于这些类别。数值类型(包括近似值(FLOAT、DOUBLE)和精确值(INT、DECIMAL))都有有符号和无符号的选项。
  • 而像文件和图像这样的二进制数据存储在 BLOB 类型中,文本存储在字符串类型(CHAR、VARCHAR 和 TEXT)中。
  • 空间类型用于处理地理或几何值,而 DATE、DATETIME 和 TIMESTAMP 等日期/时间类型则确保了精确的时间数据存储。JSON 类型则有效地存储结构化的 JSON 文档,并能自动验证它们。
  • 选择最小的合适类型、限制 ENUM/SET 的使用、避免使用基于字符串的日期以及使用 DECIMAL 以获得精度,这些都是最佳实践的例子。
  • 选择正确的数据类型可以提高数据库的可扩展性和可维护性,保证数据准确性,加快查询速度,并节省存储空间。

数值数据类型

MySQL 拥有所有必需的 SQL 数值数据类型。这些数据类型可以包括精确数值数据类型(例如,整数、小数、数值等),以及近似数值数据类型(例如,浮点数、实数和双精度)。它还支持 BIT 数据类型来存储位值。在 MySQL 中,数值数据类型分为两种:有符号或无符号,BIT 数据类型除外。

下表包含了 MySQL 支持的所有数值数据类型。

数据类型语法描述
TINYINT这是一个非常小的整数,可以是带符号或无符号的。如果是有符号的,范围是从 -128 到 127。如果是无符号的,范围是从 0 到 255。我们可以指定最多 4 位数字的宽度。它占用 1 字节的存储空间。
SMALLINT这是一个小的整数,可以是带符号或无符号的。如果是有符号的,范围是从 -32768 到 32767。如果是无符号的,范围是从 0 到 65535。我们可以指定最多 5 位数字的宽度。它需要 2 字节的存储空间。
MEDIUMINT这是一个中等大小的整数,可以是带符号或无符号的。如果是有符号的,范围是从 -8388608 到 8388607。如果是无符号的,范围是从 0 到 16777215。我们可以指定最多 9 位数字的宽度。它需要 3 字节的存储空间。
INT这是一个普通大小的整数,可以是带符号或无符号的。如果是有符号的,范围是从 -2147483648 到 2147483647。如果是无符号的,范围是从 0 到 4294967295。我们可以指定最多 11 位数字的宽度。它需要 4 字节的存储空间。
BIGINT这是一个大的整数,可以是带符号或无符号的。如果是有符号的,范围是从 -9223372036854775808 到 9223372036854775807。如果是无符号的,范围是从 0 到 18446744073709551615。我们可以指定最多 20 位数字的宽度。它需要 8 字节的存储空间。
FLOAT(m,d)这是一个浮点数,不能是无符号的。你可以定义显示长度(m)和小数位数(d)。这不是必需的,默认将是 10,2,其中 2 是小数位数,10 是总位数(包括小数)。浮点类型的十进制精度可以达到 24 位。它需要 2 字节的存储空间。
DOUBLE(m,d)这是一个双精度浮点数,不能是无符号的。你可以定义显示长度(m)和小数位数(d)。这不是必需的,默认将是 16,4,其中 4 是小数位数。双精度类型的十进制精度可以达到 53 位。REAL 是 double 的同义词。它需要 8 字节的存储空间。
DECIMAL(m,d)这是一个未打包的浮点数,不能是无符号的。在未打包的十进制数中,每个十进制数对应一个字节。定义显示长度(m)和小数位数(d)是必需的。NUMERIC 是 decimal 的同义词。
BIT(m)它用于将位值存储到表列中。这里,M 确定了每个值的位数,范围是 1 到 64。
BOOL它仅用于真和假条件。它将数值 1 视为真,将 0 视为假。
BOOLEAN它与 BOOL 类似。

日期和时间数据类型

此数据类型用于表示日期、时间、日期时间、时间戳和年份等时间值。每种时间类型都包含值,包括零。当我们插入无效值时,MySQL 无法表示它,然后会使用零值。

下表说明了 MySQL 支持的所有日期和时间数据类型。

数据类型语法最大尺寸说明
YEAR[(2|4)]年份值,可以是 2 位或 4 位数字。默认为 4 位数字。它占用 1 字节的存储空间。
DATE值范围从 '1000-01-01' 到 '9999-12-31'。显示为 'yyyy-mm-dd'。它占用 3 字节的存储空间。
TIME值范围从 '-838:59:59' 到 '838:59:59'。显示为 'HH:MM:SS'。它占用 3 字节加上小数秒的存储空间。
DATETIME值范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。显示为 'yyyy-mm-dd hh:mm:ss'。它占用 5 字节加上小数秒的存储空间。
TIMESTAMP(m)值范围从 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。显示为 'YYYY-MM-DD HH:MM:SS'。它占用 4 字节加上小数秒的存储空间。

字符串数据类型

字符串数据类型用于存储纯文本和二进制数据,例如文件、图像等。MySQL 可以根据模式匹配(如 LIKE 操作符、正则表达式等)对字符串值进行搜索和比较。

下表说明了 MySQL 支持的所有字符串数据类型。

数据类型语法最大尺寸说明
CHAR(size)它的最大长度为 255 个字符。这里的 size 是要存储的字符数。固定长度字符串。右侧填充空格以达到指定的字符数。
VARCHAR(size)它的最大长度为 255 个字符。这里的 size 是要存储的字符数。可变长度字符串。
TINYTEXT(size)它的最大长度为 255 个字符。这里的 size 是要存储的字符数。
TEXT(size)最大长度为 65,535 个字符。这里的 size 是要存储的字符数。
MEDIUMTEXT(size)它的最大长度为 16,777,215 个字符。这里的 size 是要存储的字符数。
LONGTEXT(size)它的最大长度为 4GB 或 4,294,967,295 个字符。这里的 size 是要存储的字符数。
BINARY(size)它的最大长度为 255 个字符。这里的 size 是要存储的二进制字符数。固定长度字符串。右侧填充空格以达到指定的字符数。
(MySQL 4.1.2 引入)
VARBINARY(size)它的最大长度为 255 个字符。这里的 size 是要存储的字符数。可变长度字符串。
(MySQL 4.1.2 引入)
ENUM它占用 1 或 2 字节,具体取决于枚举值的数量。ENUM 最多可以有 65,535 个值。它是 enumeration 的缩写,意味着每个列可以有指定的可能值之一。它使用数字索引(1、2、3…)来表示字符串值。
SET它占用 1、2、3、4 或 8 字节,具体取决于集合成员的数量。它可以存储最多 64 个成员。它可以包含零个或多个,或者任意数量的字符串值。它们必须是从创建表时指定的预定义值列表中选择的。

二进制大型对象数据类型 (BLOB)

MySQL 中的 BLOB 是一种可以存储可变数量数据的类型。它们根据其可以存储的最大长度被分为四种不同类型。

下表显示了 MySQL 支持的所有二进制大型对象数据类型。

数据类型语法最大尺寸
TINYBLOB它的最大长度为 255 字节。
BLOB(size)它的最大长度为 65,535 字节。
MEDIUMBLOB它的最大长度为 16,777,215 字节。
LONGBLOB它的最大长度为 4GB 或 4,294,967,295 字节。

空间数据类型

这是一种特殊类型的数据类型,用于存储各种几何和地理值。它对应于 OpenGIS 类。下表显示了 MySQL 支持的所有空间类型。

数据类型描述
GEOMETRY它是一个点或点的集合,可以存储任何有位置的空间值。
POINT几何中的一个点代表一个单一位置。它存储 X、Y 坐标的值。
POLYGON它是一个平面,表示多边形几何。它可以由零个或多个内边界和一个外边界定义。
LINESTRING它是一个具有一个或多个点值的曲线。如果它只包含两个点,它总是表示一条线。
GEOMETRYCOLLECTION它是一种几何类型,包含零个或多个几何值的集合。
MULTILINESTRING它是一种多曲线几何,包含线串值的集合。
MULTIPOINT它是多个点元素的集合。在这里,点不能以任何方式连接或排序。
MULTIPOLYGON它是一个多面对象,表示多个多边形元素的集合。它是一种二维几何。

JSON 数据类型

MySQL 从 v5.7.8 版本开始支持原生 JSON 数据类型。此数据类型允许我们快速有效地存储和访问 JSON 文档。

与将 JSON 格式的字符串存储在字符串列中相比,JSON 数据类型具有以下优点:

  1. 它提供 JSON 文档的自动验证。如果我们向 JSON 列中存储了无效文档,将会产生错误。
  2. 它提供最佳的存储格式。

选择正确的数据类型

在 MySQL 中选择正确的数据类型对于确保效率、可扩展性和准确性至关重要。在做决定时应考虑这些重要的最佳实践。

  • 为了确保数据匹配准确,请选择能可靠存储信息的最小数据类型。如果值的范围在 0 到 255 之间,请使用 TINYINT 而不是 INT。
  • 如果需要精确值,则不建议使用 FLOAT 或 DOUBLE。在金融应用中,DECIMAL 是首选。
  • 对于长度不固定的文本,CHAR 比 VARCHAR 占用更多空间。CHAR 应仅在长度固定的情况下使用。
  • 限制使用 SET 和 ENUM。对于小数值集,这些类型可以简化验证和存储,但也可能降低可移植性和灵活性。
  • 为了精确记录日期和时间,请根据格式和时区处理要求选择 TIMESTAMP、DATE 或 DATETIME。
  • 不应存储字符串格式的日期。为了提高其适合索引和排序的性能,应使索引列更小。较小的数据类型可以实现更快的搜索和排序。

提前选择正确的数据类型可以简化数据库维护、提高查询性能并节省存储空间。

总结

MySQL 数据类型用于构建任何存储和检索数据库数据的程序。文本、数字、日期和空间值等各种元素会影响数据库的结构和功能。通过基于对各种数据类型优缺点的理解做出决策,开发人员可以保持数据准确性,提高生产力并节省存储空间。选择适当的数据类型除了优化查询外,还能保证长期的可扩展性和可维护性。在选择数据类型时进行仔细的准备并遵循最佳实践,对于 MySQL 数据库系统的可靠性是必不可少的。

常见问题

1. MySQL 中有哪些可用的数据类型?

列中可以存储的值由 MySQL 的数据类型指定,这些类型包括日期、字符串、整数、浮点数以及 JSON 等特殊格式。数据库受益于其在数据处理、验证和存储方面的知识。选择正确的数据类型可以提高性能并减少存储空间的使用。此外,它还确保数据库只包含正确的信息。

2. CHAR 和 VARCHAR 有什么区别?

与 VARCHAR 不同,当值小于指定长度时,CHAR 会自动用空格填充。它兼容固定长度的数据,包括国家代码。然而,VARCHAR 只使用存储不同长度字符串所需的空间。对于像姓名和地址这样的简短文本,它效果很好。

3. 选择正确数据类型的必要性是什么?

因为它可以确保数据准确性,提高性能并节省存储空间,所以选择正确的数据类型至关重要。在不牺牲一致性或不必要数据转换的情况下,可以实现更快的索引。通过允许在不进行重大结构更改的情况下进行扩展,正确的数据类型选择也有助于数据库设计,改进查询优化,并防止未来的可扩展性问题。

4. 什么是 DOUBLE 数据类型?

它是一种无符号双精度浮点数。小数位数(D)和显示长度(M)都可以配置。这不是必需的;默认使用 16,4,其中 4 是小数位数。对于 DOUBLE,十进制精度最高可达 53 位。DOUBLE 是 REAL 的同义词。

5. 解释 MySQL 中的 BLOB。

一个字段,最多可包含 65535 个字符。“二进制大型对象”(BLOB)用于存储大量的二进制数据,包括图片或其他类型的文件。在指定为 TEXT 的字段中也存储大量数据。两者之间的区别在于,BLOB 对存储的数据进行区分大小写的排序和比较,而 TEXT 字段则不行。BLOB 和 TEXT 都不能设置长度。


下一主题MySQL 变量