概述
- MySQL 是一个广泛使用的关系型数据库管理系统,它支持多种数据类型,
- 可分为三大类:数值类型、日期和时间类型、字符串类型,
- 另外还有一些特殊类型(如 JSON、空间数据类型等)。下面我将详细介绍这些类型及其特点。
- 资料已经分类整理好:
https://pan.quark.cn/s/f52968c518d3
一、数值类型
数值类型用于存储数字,可分为整数类型和浮点类型。
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
)只能存储非负数,范围更大。 - 可指定显示宽度(如
INT(5)
),但不影响存储范围,仅用于格式化输出。
2. 浮点类型
- FLOAT:4字节,单精度浮点数,精度约为 7 位小数。
- DOUBLE:8字节,双精度浮点数,精度约为 15 位小数。
- DECIMAL/NUMERIC:用于存储精确的小数值,如
DECIMAL(10,2)
表示总共 10 位数字,其中小数部分占 2 位。
特点:
FLOAT
和DOUBLE
适用于近似值计算,可能存在精度损失。DECIMAL
适用于财务计算(如金额),确保精确性,但性能略低于浮点类型。
二、日期和时间类型
用于存储日期和时间值。
1. 常用类型
- DATE:格式为
YYYY-MM-DD
,范围从1000-01-01
到9999-12-31
。 - TIME:格式为
HH:MM:SS
,范围从-838:59:59
到838:59:59
(支持负数表示时间间隔)。 - DATETIME:格式为
YYYY-MM-DD HH:MM:SS
,范围从1000-01-01 00:00:00
到9999-12-31 23:59:59
。 - TIMESTAMP:格式同
DATETIME
,但范围更小(1970-01-01 00:00:01 UTC
到2038-01-19 03:14:07 UTC
),且会自动转换为服务器时区。 - YEAR:格式为
YYYY
或YY
(如2023
或23
),范围从1901
到2155
。
特点:
TIMESTAMP
占用 4 字节(比DATETIME
的 8 字节更节省空间),且支持自动更新(如ON UPDATE CURRENT_TIMESTAMP
)。DATETIME
存储的是实际值,与时区无关。
三、字符串类型
用于存储文本或二进制数据。
1. 固定长度字符串
- CHAR(N):固定长度字符串,
N
为字符数(1 ≤ N ≤ 255)。 - BINARY(N):固定长度二进制字符串,
N
为字节数。
特点:
CHAR
会自动填充空格以达到指定长度,检索时去除尾部空格。BINARY
用于存储二进制数据(如图片、文件)。
2. 可变长度字符串
- VARCHAR(N):可变长度字符串,
N
为最大字符数(1 ≤ N ≤ 65,535)。 - VARBINARY(N):可变长度二进制字符串。
特点:
VARCHAR
仅存储实际长度,更节省空间,但检索效率略低于CHAR
。
3. 大文本和二进制类型
- TEXT:存储大文本,最大长度为 65,535 字节(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT 分别支持不同长度)。
- BLOB:存储二进制大对象,最大长度为 65,535 字节(TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB 分别支持不同长度)。
特点:
TEXT
和BLOB
不支持默认值。- 避免在
WHERE
条件中使用TEXT/BLOB
字段,可能影响性能。
4. 枚举和集合类型
- ENUM(‘value1’,‘value2’,…):从预定义列表中选择单个值,最多 65,535 个选项。
- SET(‘value1’,‘value2’,…):从预定义列表中选择 0 个或多个值,最多 64 个选项。
特点:
ENUM
和SET
存储为整数,节省空间且查询效率高。
四、特殊类型
1. JSON
- JSON:存储 JSON 格式数据(如
{"name":"John","age":30}
)。 - 特点:支持 JSON 函数(如
JSON_EXTRACT
),但性能略低于传统列。
2. 空间数据类型
- GEOMETRY:存储任意几何对象(点、线、多边形等)。
- POINT、LINESTRING、POLYGON:存储特定类型的几何对象。
- 特点:用于地理信息系统(GIS),需配合空间索引(如 SPATIAL)。
3. 其他类型
- BOOLEAN/TINYINT(1):MySQL 中没有真正的
BOOLEAN
,通常用TINYINT(1)
代替,0
表示FALSE
,非0
表示TRUE
。 - BIT(N):存储位值,
N
为位数(1 ≤ N ≤ 64)。
五、选择建议
- 整数:根据数值范围选择合适的类型(如
TINYINT
用于状态码,INT
用于用户 ID)。 - 小数:财务计算用
DECIMAL
,其他场景用FLOAT/DOUBLE
。 - 日期时间:
TIMESTAMP
用于需要自动更新的场景,DATETIME
用于固定时间。 - 字符串:固定长度用
CHAR
,可变长度用VARCHAR
,大文本用TEXT
。
通过合理选择数据类型,可以优化存储效率和查询性能。