数据类型指定了特定的数据类型,例如整数,浮点数,布尔值等。它还标识了该类型的可能值,操作可以在该类型上执行的操作以及该类型的值的存储方式。在MySQL中,每个数据库表都有许多列,并且每个列包含特定的数据类型。
我们可以确定MySQL中具有以下特征的数据类型:
- 它代表的值的类型(固定或可变)。
- 它占用的存储空间取决于这些值是固定长度还是可变长度。
- 其值可以建立索引或不建立索引。
- MySQL如何执行特定数据类型的值的比较。
MySQL支持各种类别中的许多 SQL 标准数据类型。它使用许多不同的数据类型,这些数据类型可以分为以下几类: 数字,日期和时间,字符串类型,空间类型和 JSON 数据类型。
在 MySQL 中,数据类型用于定义表中列的属性。选择合适的数据类型对存储效率和查询性能至关重要。MySQL 提供了多种数据类型,主要分为以下几类:
1. 数值类型
MySQL 数值类型用于存储整数、小数和浮点数。
1.1 整数类型
数据类型 |
存储大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
-128 ~ 127 |
0 ~ 255 |
小范围的整数值 |
SMALLINT |
2 字节 |
-32,768 ~ 32,767 |
0 ~ 65,535 |
中等范围的整数值 |
MEDIUMINT |
3 字节 |
-8,388,608 ~ 8,388,607 |
0 ~ 16,777,215 |
较大的整数值 |
INT 或 INTEGER |
4 字节 |
-2,147,483,648 ~ 2,147,483,647 |
0 ~ 4,294,967,295 |
常用的整数类型 |
BIGINT |
8 字节 |
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
0 ~ 18,446,744,073,709,551,615 |
超大范围的整数值 |
UNSIGNED
修饰符:
- 如果列声明为
UNSIGNED
,则只能存储非负数,范围从 0
到最大正值。
- 例如:
TINYINT UNSIGNED
的范围是 0 ~ 255
。
1.2 小数和浮点类型
数据类型 |
存储大小 |
范围 |
精度 |
用途 |
DECIMAL(M,D) 或 NUMERIC(M,D) |
依赖定义(每个数字占 1 字节) |
-10^M ~ 10^M(M 是总位数,D 是小数位数) |
精确到小数点后 D 位 |
精确存储小数(如财务数据) |
FLOAT(M,D) |
4 字节 |
-3.402823466E+38 ~ 3.402823466E+38 |
精度较低(约 7 位有效数字) |
存储较小范围的浮点数 |
DOUBLE(M,D) 或 REAL |
8 字节 |
-1.7976931348623157E+308 ~ 1.7976931348623157E+308 |
精度较高(约 15-16 位有效数字) |
存储较大范围的浮点数 |
- 区别:
DECIMAL
是定点数,存储为字符串,不会有精度损失,适合财务数据等场景。
FLOAT
和 DOUBLE
是近似值存储,可能会有精度损失。
2. 日期和时间类型
MySQL 提供多种日期和时间类型,用于存储日期、时间或两者的组合。
数据类型 |
存储大小 |
格式 |
范围 |
用途 |
DATE |
3 字节 |
YYYY-MM-DD |
1000-01-01 ~ 9999-12-31 |
存储日期(不包含时间) |
DATETIME |
8 字节 |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
存储日期和时间 |
TIMESTAMP |
4 字节 |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
存储 Unix 时间戳,受时区影响 |
TIME |
3 字节 |
HH:MM:SS |
-838:59:59 ~ 838:59:59 |
存储时间(不包含日期) |
YEAR |
1 字节 |
YYYY |
1901 ~ 2155 |
存储年份 |
- 区别:
DATETIME
是固定格式,不受时区影响。
TIMESTAMP
会根据服务器或会话的时区自动调整。
3. 字符串类型
MySQL 提供多种字符串类型,支持存储文本、二进制数据等。
3.1 字符串类型
数据类型 |
存储大小 |
最大长度 |
描述 |
CHAR(M) |
固定长度(M 字符,每字符 1 字节) |
0 ~ 255 字符 |
固定长度字符串(不足部分用空格填充)。 |
VARCHAR(M) |
实际长度 + 1 或 2 字节 |
0 ~ 65,535 字节 |
可变长度字符串,推荐用于变长文本。 |
TEXT |
实际长度 + 2 字节 |
0 ~ 65,535 字节 |
存储大文本数据,按大小分为以下几种: |
TEXT 类型子分类
类型 |
最大长度 |
TINYTEXT |
255 字节 |
TEXT |
65,535 字节 |
MEDIUMTEXT |
16,777,215 字节 |
LONGTEXT |
4,294,967,295 字节 |
3.2 二进制字符串类型
数据类型 |
存储大小 |
最大长度 |
描述 |
BINARY(M) |
固定长度(M 字节) |
0 ~ 255 字节 |
固定长度二进制数据。 |
VARBINARY(M) |
实际长度 + 1 或 2 字节 |
0 ~ 65,535 字节 |
可变长度二进制数据。 |
BLOB |
实际长度 + 2 字节 |
0 ~ 65,535 字节 |
存储二进制大对象,按大小分为以下几种: |
BLOB 类型子分类
类型 |
最大长度 |
TINYBLOB |
255 字节 |
BLOB |
65,535 字节 |
MEDIUMBLOB |
16,777,215 字节 |
LONGBLOB |
4,294,967,295 字节 |
4. 枚举和集合类型
数据类型 |
描述 |
ENUM |
枚举类型,允许从预定义的一组字符串值中选择一个值。例如:ENUM('small', 'medium', 'large') |
SET |
集合类型,允许从预定义的一组字符串值中选择一个或多个值。例如:SET('a', 'b', 'c', 'd') |
- 区别:
ENUM
每次只能选择一个值。
SET
可以选择多个值。
5. JSON 类型
数据类型 |
描述 |
JSON |
存储 JSON 格式的文档,用于结构化或半结构化数据的存储。 |
- 特点:
- 支持 JSON 数据的验证。
- 提供 JSON 操作函数(如
JSON_EXTRACT()
)。
6. 数据类型选择建议
- 数值类型:
- 优先选择能满足需求的最小整数类型(如
TINYINT
、INT
等),以节约存储空间。
- 财务数据建议使用
DECIMAL
以避免浮点数精度问题。
- 日期和时间类型:
- 如果只存储日期,选择
DATE
。
- 如果需要存储时间戳并自动调整时区,选择
TIMESTAMP
。
- 字符串类型:
- 短文本使用
VARCHAR
。
- 长文本(如文章内容)使用
TEXT
。
- 二进制数据(如图片、文件)使用
BLOB
。
- JSON 类型:
通过合理选择数据类型,可以优化存储效率和查询性能!