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 数据类型具有以下优点: - 它提供 JSON 文档的自动验证。如果我们向 JSON 列中存储了无效文档,将会产生错误。
- 它提供最佳的存储格式。
选择正确的数据类型在 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 都不能设置长度。 |