在 MySQL 数据库开发中,数据类型的合理选择直接影响到数据存储的效率、查询性能以及存储空间的占用。MySQL 8.0 作为主流的数据库版本,提供了丰富且灵活的基本数据类型,涵盖数值型、字符串型、日期时间型等核心类别。本文将针对 MySQL 8.0 版本,对各类基本数据类型进行详细梳理,包括其特点、取值范围、适用场景及使用注意事项,助力开发者快速掌握并合理运用这些数据类型。
一、数值型数据类型
数值型数据类型用于存储整数、小数等数值信息,MySQL 8.0 按照存储范围和精度的不同,将其分为整数型、浮点数型和定点数型三大类,各类别下又包含多种具体类型,以满足不同场景的存储需求。
1. 整数型
整数型是最常用的数值类型之一,用于存储没有小数部分的数值,支持正负整数。MySQL 8.0 提供了 5 种整数型数据类型,分别为 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT,它们的区别主要在于存储空间和取值范围。
-
TINYINT:占用 1 字节存储空间,取值范围为 -128 ~ 127(有符号)或 0 ~ 255(无符号)。适用于存储取值范围较小的整数,如性别(0 表示女、1 表示男)、状态标识(0 表示禁用、1 表示启用)等。
-
SMALLINT:占用 2 字节存储空间,取值范围为 -32768 ~ 32767(有符号)或 0 ~ 65535(无符号)。适用于存储中等范围的整数,如部门编号、小范围的统计数据等。
-
MEDIUMINT:占用 3 字节存储空间,取值范围为 -8388608 ~ 8388607(有符号)或 0 ~ 16777215(无符号)。适用于存储较大范围的整数,如用户 ID、订单编号等(数据量中等的场景)。
-
INT(INTEGER):占用 4 字节存储空间,取值范围为 -2147483648 ~ 2147483647(有符号)或 0 ~ 4294967295(无符号)。是最常用的整数类型,适用于大多数需要存储整数的场景,如商品 ID、用户年龄、订单数量等。
-
BIGINT:占用 8 字节存储空间,取值范围为 -9223372036854775808 ~ 9223372036854775807(有符号)或 0 ~ 18446744073709551615(无符号)。适用于存储取值范围极大的整数,如大数据量下的用户 ID、日志 ID、分布式系统中的全局唯一标识等。
注意:整数型数据默认是有符号的,若需要存储无符号整数,可在类型后添加 UNSIGNED 关键字。例如:TINYINT UNSIGNED 表示无符号tinyint类型。
2. 浮点数型
浮点数型用于存储带有小数部分的数值,属于近似值类型,即存储的数值可能存在微小的精度误差。MySQL 8.0 提供了 FLOAT 和 DOUBLE 两种浮点数类型。
-
FLOAT:单精度浮点数,占用 4 字节存储空间,可表示的数值范围约为 ±3.402823466E+38,精度约为 6 ~ 7 位有效数字。适用于对精度要求不高的场景,如商品价格的粗略计算、温度数据等。
-
DOUBLE:双精度浮点数,占用 8 字节存储空间,可表示的数值范围约为 ±1.7976931348623157E+308,精度约为 15 ~ 17 位有效数字。适用于对精度要求较高的场景,如科学计算、金融数据的初步计算等。
使用浮点数类型时,可以指定精度和小数位数,语法为:FLOAT(M, D) 或 DOUBLE(M, D),其中 M 表示总有效数字位数,D 表示小数部分的位数。例如:FLOAT(6, 2) 表示总共有 6 位有效数字,其中小数部分占 2 位,取值范围为 -9999.99 ~ 9999.99。
3. 定点数型
定点数型同样用于存储带有小数部分的数值,但与浮点数不同的是,定点数是精确值类型,能够精确存储小数,不存在精度误差。MySQL 8.0 中定点数类型为 DECIMAL(也可写作 DEC)。
DECIMAL 类型的存储空间根据其精度动态变化,语法为 DECIMAL(M, D),其中 M 表示总有效数字位数(1 ~ 65),D 表示小数部分的位数(0 ~ 30,且 D ≤ M)。例如:DECIMAL(10, 2) 表示总共有 10 位有效数字,小数部分占 2 位,可精确存储如 12345678.90 这样的数值。
DECIMAL 适用于对精度要求极高的场景,如金融领域的金额计算(转账金额、交易金额等),确保数值的精确性,避免因精度误差导致的经济损失。
二、字符串型数据类型
字符串型数据类型用于存储字符、文本等字符串信息,MySQL 8.0 提供了多种字符串类型,包括 CHAR、VARCHAR、TEXT、ENUM、SET 等,不同类型在存储空间、存储方式和适用场景上存在差异。
1. CHAR 与 VARCHAR
CHAR 和 VARCHAR 是最常用的字符串类型,均用于存储定长或变长的字符串,核心区别在于存储方式和存储空间占用。
-
CHAR:定长字符串,语法为 CHAR(M),其中 M 表示字符串的固定长度(1 ~ 255)。无论实际存储的字符串长度是否达到 M,都会占用 M 个字符的存储空间。例如:CHAR(10) 存储字符串 "abc" 时,仍会占用 10 个字符的空间,剩余部分用空格填充。CHAR 适用于存储长度固定的字符串,如身份证号(18 位)、手机号(11 位)、邮编等,其查询效率较高。
-
VARCHAR:变长字符串,语法为 VARCHAR(M),其中 M 表示字符串的最大长度(1 ~ 65535)。实际存储空间为字符串的实际长度加上 1 ~ 2 个字节的长度标识(用于记录字符串的实际长度)。例如:VARCHAR(10) 存储字符串 "abc" 时,仅占用 3 + 1 = 4 个字符的空间。VARCHAR 适用于存储长度不固定的字符串,如用户名、商品名称、文章标题等,能够节省存储空间。
注意:在 MySQL 8.0 中,VARCHAR 类型的最大长度限制为 65535 字节,若字段采用 UTF-8 编码(每个字符占用 3 字节),则最大可存储的字符数为 65535 / 3 ≈ 21845 个。
2. TEXT 类型
TEXT 类型用于存储大量的文本数据,属于长字符串类型,MySQL 8.0 提供了 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 四种 TEXT 类型,它们的区别在于最大存储长度。
-
TINYTEXT:最大存储长度为 255 字节,适用于存储较短的文本片段,如简短的备注信息。
-
TEXT:最大存储长度为 65535 字节(约 64KB),适用于存储中等长度的文本,如文章摘要、商品描述等。
-
MEDIUMTEXT:最大存储长度为 16777215 字节(约 16MB),适用于存储较长的文本,如长篇文章、日志记录等。
-
LONGTEXT:最大存储长度为 4294967295 字节(约 4GB),适用于存储极大的文本数据,如大型文档、备份数据等。
需要注意的是,TEXT 类型的字段不能设置默认值,且查询效率相对 CHAR 和 VARCHAR 较低,因此在实际开发中,若文本长度较短,优先使用 VARCHAR 类型。
3. ENUM 与 SET 类型
ENUM 和 SET 是两种特殊的字符串类型,用于存储预定义的枚举值或集合值,能够有效限制字段的取值范围,提高数据的规范性。
-
ENUM:枚举类型,用于存储从预定义的枚举列表中选择的单个值。语法为 ENUM('value1', 'value2', ..., 'valuen'),其中枚举值的数量最多为 65535 个。例如:ENUM('男', '女', '未知') 可用于存储性别信息,字段值只能是这三个值中的一个。ENUM 类型存储效率较高,查询时可通过索引快速定位。
-
SET:集合类型,用于存储从预定义的集合列表中选择的一个或多个值(多个值之间用逗号分隔)。语法为 SET('value1', 'value2', ..., 'valuen'),其中集合值的数量最多为 64 个。例如:SET('篮球', '足球', '羽毛球', '乒乓球') 可用于存储用户的兴趣爱好,字段值可以是 '篮球'、'篮球,足球' 等。SET 类型适用于存储多选项数据,但由于其取值范围有限,且查询和更新相对复杂,使用场景不如 ENUM 广泛。
三、日期时间型数据类型
日期时间型数据类型用于存储日期、时间或日期时间组合信息,MySQL 8.0 提供了 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR 五种日期时间类型,满足不同场景下对时间信息的存储需求。
-
DATE:用于存储日期信息,格式为 'YYYY-MM-DD',取值范围为 '1000-01-01' ~ '9999-12-31',占用 3 字节存储空间。适用于存储仅需要日期的场景,如用户生日、商品生产日期等。
-
TIME:用于存储时间信息,格式为 'HH:MM:SS',取值范围为 '-838:59:59' ~ '838:59:59',占用 3 字节存储空间。适用于存储仅需要时间的场景,如会议开始时间、商品发货时间(仅小时分钟)等。需要注意的是,TIME 类型不仅支持正时间,还支持负时间,可用于表示时间间隔。
-
DATETIME:用于存储日期和时间的组合信息,格式为 'YYYY-MM-DD HH:MM:SS',取值范围为 '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59',占用 8 字节存储空间(MySQL 8.0 中默认采用此存储方式)。适用于存储需要同时记录日期和时间的场景,如订单创建时间、用户注册时间等。DATETIME 类型的时间不受时区影响,存储的是绝对时间。
-
TIMESTAMP:用于存储日期和时间的组合信息,格式与 DATETIME 相同,为 'YYYY-MM-DD HH:MM:SS',取值范围为 '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC,占用 4 字节存储空间。TIMESTAMP 类型的时间受时区影响,存储的是相对于 UTC(世界协调时间)的时间戳,当数据库时区发生变化时,查询出的时间会自动转换为对应时区的时间。此外,TIMESTAMP 类型支持自动更新,可通过设置 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 实现字段值自动设置为当前时间(新增记录时)或自动更新为当前时间(修改记录时)。
-
YEAR:用于存储年份信息,有两种存储格式:YEAR(4)(取值范围 '1901' ~ '2155')和 YEAR(2)(取值范围 '70' ~ '69',对应 '1970' ~ '2069'),占用 1 字节存储空间。适用于仅需要存储年份的场景,如历史事件年份、产品上市年份等。MySQL 8.0 中推荐使用 YEAR(4) 格式,以避免年份解析歧义。
四、其他基本数据类型
除了上述三大核心类别,MySQL 8.0 还提供了一些其他基本数据类型,用于满足特殊的存储需求。
1. BIT 类型
BIT 类型用于存储二进制数据,语法为 BIT(M),其中 M 表示二进制位数(1 ~ 64),占用 M/8 字节(向上取整)存储空间。例如:BIT(1) 可存储 1 位二进制数(0 或 1),适用于存储布尔值;BIT(8) 可存储 8 位二进制数,适用于存储简单的二进制标识。BIT 类型的字段查询时,默认返回二进制字符串,若需要转换为十进制数,可使用 CAST 函数。
2. BINARY 与 VARBINARY 类型
BINARY 和 VARBINARY 类型用于存储二进制字符串,与 CHAR 和 VARCHAR 类似,区别在于 BINARY 是定长二进制字符串,VARBINARY 是变长二进制字符串。它们适用于存储二进制数据,如图片、音频、视频等文件的二进制流,或加密后的密文数据。语法分别为 BINARY(M) 和 VARBINARY(M),其中 M 表示最大长度(字节数),BINARY(M) 占用 M 字节存储空间,VARBINARY(M) 占用实际二进制数据长度 + 1 ~ 2 字节的长度标识。
五、数据类型选择原则
合理选择数据类型是 MySQL 数据库优化的基础,遵循以下原则可有效提升数据库性能和存储空间利用率:
-
最小够用原则:在满足业务需求的前提下,优先选择存储范围最小的数据类型。例如:存储用户年龄(0 ~ 120),使用 TINYINT 即可,无需使用 INT,避免存储空间浪费。
-
精确性优先原则:对于需要精确计算的数值(如金融数据),优先使用 DECIMAL 定点数类型,避免使用 FLOAT 或 DOUBLE 浮点数类型导致的精度误差。
-
查询效率优先原则:对于频繁查询的字段,优先选择存储效率和查询效率高的数据类型。例如:长度固定的字符串(如身份证号)使用 CHAR 类型,查询效率高于 VARCHAR;日期时间信息若需要时区转换,使用 TIMESTAMP 类型,否则使用 DATETIME 类型。
-
数据规范性原则:对于取值范围固定的字段,优先使用 ENUM 或 SET 类型,限制字段取值,提高数据规范性,减少数据错误。
六、总结
MySQL 8.0 提供的基本数据类型涵盖了数值、字符串、日期时间等各类数据的存储需求,不同数据类型在存储空间、精度、查询效率等方面各有优劣。开发者在实际开发中,需结合业务场景、数据特点和查询需求,合理选择数据类型,既要满足业务功能需求,又要兼顾数据库性能和存储空间优化。通过本文的梳理,希望能帮助大家系统掌握 MySQL 8.0 基本数据类型的核心知识,为后续数据库开发和优化工作奠定基础。