MySQL 提供丰富的数据类型,支持从简单的字符串到复杂的 JSON 和二进制数据,满足多样化的存储需求。本文基于 sql_store 数据库,系统讲解 MySQL 的主要数据类型,包括字符串、数值、日期时间、BLOB、JSON 等,结合代码示例说明其定义、应用场景及操作方法,帮助读者合理选择数据类型以优化数据库设计。
学习内容
1. 字符串类型
字符串类型用于存储文本数据,常见类型包括:
- CHAR:固定长度字符串,最大 255 个字符,长度不足时用空格填充,适合长度一致的数据(如状态码)。
- VARCHAR:可变长度字符串,最大 65,535 字节(约 21,844 个 UTF-8 字符),动态分配存储空间,适合长度变化较大的数据(如用户名)。
- TEXT 系列:
-
- TINYTEXT:最大 255 字节。
- TEXT:最大 65,535 字节。
- MEDIUMTEXT:最大 16,777,215 字节(约 16 MB)。
- LONGTEXT:最大 4,294,967,295 字节(约 4 GB)。 适用于存储长文本,如文章或日志。
应用场景:
- 电话号码等不需计算的数值可存储为 VARCHAR。
- 名字、密码建议用 VARCHAR(50),地址用 VARCHAR(255)。
- 超长文本(如文章)使用 MEDIUMTEXT 或 LONGTEXT。
2. 数值类型
数值类型分为整数和浮点数,支持精确和近似存储:
- 整数类型:
-
- 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 TINYINT。
- ZEROFILL 补零显示,控制输出格式。
- 浮点数:
-
- DECIMAL(p,s):固定精度,p 为总位数(1-65),s 为小数位数,适合精确计算(如货币)。别名包括 DEC、NUMERIC、FIXED。
- FLOAT:4 字节,近似值,适合大范围数值。
- DOUBLE:8 字节,近似值,精度高于 FLOAT。
应用场景:
- 年龄使用 UNSIGNED TINYINT,范围足够且节省空间。
- 财务数据使用 DECIMAL 确保精度。
3. 布尔类型
BOOLEAN(或 BOOL)存储 TRUE 或 FALSE,实际以 TINYINT(1) 实现,0 表示 FALSE,1 表示 TRUE。
4. 枚举与集合类型
- ENUM:限制列值在指定列表中,如 ENUM('SMALL', 'MEDIUM', 'LARGE'),适合固定选项(如尺码)。建议将枚举值存储为单独表以提高灵活性。
- SET:类似 ENUM,但允许存储多个值,如 SET('A', 'B', 'C'),适合多选场景。
5. 日期与时间类型
日期时间类型支持多种格式:
- 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,但以 UTC 存储,支持 1970-01-01 00:00:01 到 2038-01-19 03:14:07,自动转换时区。
- YEAR:存储年份,格式 YYYY,范围 1901 到 2155。
应用场景:订单日期使用 DATETIME,日志时间使用 TIMESTAMP。
6. BLOB 类型
BLOB(二进制长对象)存储二进制数据,如图片、视频、PDF 等:
- TINYBLOB:最大 255 字节。
- BLOB:最大 65,535 字节(约 64 KB)。
- MEDIUMBLOB:最大 16,777,215 字节(约 16 MB)。
- LONGBLOB:最大 4,294,967,295 字节(约 4 GB)。
应用场景:小型图标用 TINYBLOB,大型视频用 LONGBLOB。
7. JSON 类型
JSON 类型存储结构化数据(如对象、数组),便于处理复杂数据。格式示例:
{
"name": "John",
"age": 30,
"isStudent": false
}
支持嵌套结构、数组和多种数据类型,适合动态或半结构化数据。
示例代码与讲解
1. 创建 JSON 列
ALTER TABLE products
ADD COLUMN properties JSON;
为 products 表添加 properties 列,用于存储 JSON 格式数据。
2. 插入 JSON 数据
方法 1:直接插入 JSON 字符串:
UPDATE products
SET properties = '{
"dimensions": 1, 2, 3,
"weight": 10,
"manufacturer": {"name": "sony"}
}'
WHERE product_id = 1;
方法 2:使用 JSON 函数:
UPDATE products
SET properties = JSON_OBJECT(
'dimensions', JSON_ARRAY(1, 2, 3),
'weight', 10,
'manufacturer', JSON_OBJECT('name', 'sony')
)
WHERE product_id = 1;
两种方法将 JSON 数据存储到 product_id = 1 的 properties 列,包含数组、数值和嵌套对象。
3. 查询 JSON 数据
SELECT * FROM products WHERE product_id = 1;
返回 properties 列的 JSON 对象。
4. 提取 JSON 值
**使用 JSON_EXTRACT**:
SELECT product_id, JSON_EXTRACT(properties, '$.weight')
FROM products
WHERE product_id = 1;
**使用路径运算符 ->**:
SELECT product_id, properties -> '$.weight'
FROM products
WHERE product_id = 1;
提取 weight 键的值,返回 10。
提取数组元素:
SELECT product_id, properties -> '$.dimensions0'
FROM products
WHERE product_id = 1;
提取 dimensions 数组的第一个元素,返回 1。
提取嵌套对象(去引号):
SELECT product_id, properties ->> '$.manufacturer.name'
FROM products
WHERE product_id = 1;
使用 ->> 提取 manufacturer.name,返回 sony(无引号)。
5. 修改 JSON 数据
UPDATE products
SET properties = JSON_SET(
properties,
'$.weight', 20,
'$.age', 25
)
WHERE product_id = 1;
修改 weight 为 20,添加 age 键,值为 25。
6. 删除 JSON 键
UPDATE products
SET properties = JSON_REMOVE(properties, '$.age')
WHERE product_id = 1;
删除 age 键,保留其他 JSON 数据。
总结
MySQL 的数据类型涵盖字符串、数值、日期时间、BLOB 和 JSON,满足从简单文本到复杂结构化数据的存储需求。合理选择数据类型(如用 UNSIGNED TINYINT 存年龄、DECIMAL 存货币)可优化存储空间和性能。JSON 类型为半结构化数据提供灵活支持,结合路径运算符和函数,便于操作复杂数据。本文基于 sql_store 数据库,通过代码示例解析数据类型的定义与应用。后续内容将探讨表设计或查询优化,敬请关注。