mysql菜鸟教程
4.3 数据类型详解:整数、小数、文本、日期等
在MySQL中,数据类型定义了表中每个列可以存储的数据种类,如数字、字符串、日期等。它为每列数据预先设定好“形状”和“大小”,是确保数据正确、高效和节省空间存储的基石。选错类型,可能导致数据错误、性能低下或存储浪费。
下面我们来深入认识每一个核心数据类型。
一、数值类型
1. 整数类型
用于存储没有小数部分的数字,如年龄、数量、ID等。
类型
存储空间
有符号 (SIGNED) 取值范围
无符号 (UNSIGNED) 取值范围
特点与适用场景
TINYINT
1字节
-128 ~ 127
0 ~ 255
微小范围,如状态码(0/1)、年龄(使用UNSIGNED)。
SMALLINT
2字节
-32,768 ~ 32,767
0 ~ 65,535
较小范围,如年份、小规模数量。
MEDIUMINT
3字节
-8百万 ~ 8百万
0 ~ 16百万
中等范围。
**
INT
(或
INTEGER
)
4字节
-21亿 ~ 21亿
0 ~ 42亿
最常用
。适用于用户ID、订单号、大数量计数等。
BIGINT
8字节
-9.22×10¹⁸ ~ 9.22×10¹⁸
0 ~ 1.84×10¹⁹
极大范围,如金融交易流水、海量数据的主键。
使用示例:
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 无符号自增主键
age TINYINT UNSIGNED, -- 年龄,不会为负
status TINYINT DEFAULT 1 -- 状态,默认1(激活)
);
2. 小数(浮点数 & 定点数)类型
用于存储带小数部分的数字,如价格、评分、科学计数。
类型
存储空间与描述
精度与范围
特点与适用场景
FLOAT(M, D)
4字节,单精度浮点数。
约7位有效数字。
有误差,但速度快、空间小。适合对精度要求不高的科学数据、统计数据。
DOUBLE(M, D)
8字节,双精度浮点数。
约15位有效数字。
精度高于FLOAT,但仍有误差。用途与FLOAT类似,精度要求更高时使用。
DECIMAL(M, D)
变长,精确存储为字符串。
精确
,M为总位数,D是小数位数。
金融、货币计算必选
。绝对精确无误差,但计算比FLOAT/DOUBLE慢。
参数解释:
-
M:总位数(精度),包括整数位和小数位。
-
D:小数位数(标度)。
使用示例:
CREATE TABLE products (
price DECIMAL(10, 2), -- 价格,精确到分,例如 99999999.99
rating FLOAT(3, 1), -- 评分,如 4.5,允许轻微误差
weight DOUBLE(8, 3) -- 重量,如 12.345
);
二、文本与字符串类型
用于存储非数字的字符数据。
1. 基本字符串类型
类型
最大长度
描述
特点与适用场景
CHAR(M)
0-255字符
定长
字符串。M定义字符数,不足部分用空格填充。
存取速度稍快
。适合长度
固定或变化极小
的数据,如MD5哈希值(32位)、国家代码(如’CN‘)、性别(‘M’, ‘F’)。
VARCHAR(M)
0-65,535字符
(受行最大长度限制)
变长
字符串。M定义最大字符数,实际存储按需分配。
节省存储空间
。适合长度
变化较大
的数据,如用户名、文章标题、地址。
最常用
。
CHAR vs VARCHAR 选择:若数据长度几乎不变(如身份证号18位),选CHAR;若长度变化大(如姓名2-4个字),选VARCHAR。在MySQL中,VARCHAR更为常用。
2. 文本类型
用于存储大段文本。
类型
最大长度 (字符)
特点与适用场景
TINYTEXT
255
短文本。
TEXT
65,535 (64KB)
常用
,适合文章内容、产品描述、评论等。
MEDIUMTEXT
16,777,215 (16MB)
较大文本,如书籍章节、日志文件。
LONGTEXT
4,294,967,295 (4GB)
极大文本,如整个电子书、大型HTML代码。
使用示例:
CREATE TABLE articles (
title VARCHAR(200), -- 标题,变长字符串
summary TINYTEXT, -- 摘要,短文本
content TEXT, -- 正文,长文本
full_content LONGTEXT -- 完整内容,超长文本
);
3. 枚举与集合类型
用于限定字段值在一个预定义的列表中选择。
类型
描述
示例
ENUM(‘值1‘, ’值2‘, ...)
枚举,
单选
。只能从列表中选取一个值。
ENUM(‘男‘, ’女‘, ’保密‘)
SET(‘值1‘, ’值2‘, ...)
集合,
多选
。可以从列表中选取多个值(用逗号分隔存储)。
SET(‘阅读‘, ’音乐‘, ’运动‘)
使用示例与注意:
CREATE TABLE members (
gender ENUM('男', '女', '其他'), -- 性别,三选一
hobbies SET('读书', '游戏', '旅游', '健身') -- 爱好,可多选
);
-- 插入数据
INSERT INTO members (gender, hobbies) VALUES ('男', '读书,旅游');
注意:ENUM和SET在数据库设计中需谨慎使用,因为它们不易维护(修改选项需改表结构),且可移植性较差。有时用关联表或VARCHAR加检查约束可能是更灵活的选择。
三、日期与时间类型
用于存储日期、时间或组合。
类型
格式
取值范围
特点与适用场景
DATE
YYYY-MM-DD
1000-01-01 ~ 9999-12-31
只存储日期
,如生日、入职日期。
TIME
HH:MM:SS
或
HHH:MM:SS
-838:59:59 ~ 838:59:59
只存储时间
,如课程时间、打卡时间。可为负值或大于24小时。
DATETIME
YYYY-MM-DD HH:MM:SS
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
存储日期+时间
,与时区无关。适合记录固定的、用户可理解的时间点,如订单创建时间、活动开始时间。
TIMESTAMP
YYYY-MM-DD HH:MM:SS
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
存储日期+时间
,但
与时区相关
,存储时转为UTC,检索时转回当前时区。占用4字节,空间小。常记录
数据行最后的自动更新时间
。有2038年限制。
YEAR
YYYY
1901 ~ 2155
只存储年份
。
使用示例:
CREATE TABLE events (
event_date DATE, -- 活动日期
start_time TIME, -- 开始时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间(固定)
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间(自动)
);
四、其他类型
-
JSON (MySQL 5.7+): 用于存储半结构化的JSON文档,便于灵活扩展。
-
二进制类型 (BINARY, VARBINARY, BLOB): 类似CHAR/VARCHAR/TEXT,但存储的是二进制字节流,如图片、音频等文件的二进制数据,通常不建议直接存数据库,而是存储文件路径。
综合运用以上知识,我们来设计一个简化的博客文章表:
CREATE TABLE blog_posts (
-- 数值类型:ID和计数
post_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
view_count INT UNSIGNED DEFAULT 0,
-- 字符串类型:标题、摘要、内容
title VARCHAR(255) NOT NULL,
summary VARCHAR(500),
content TEXT NOT NULL,
-- 日期时间类型:发布时间和更新时间
publish_time DATETIME,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- 枚举类型:文章状态
status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
-- 小数类型:评分(如果需要)
rating DECIMAL(3, 2) -- 例如 9.85
-- 注意:实际表结构会包含作者ID等外键,这里仅为数据类型示例。
);
总结
-
整数:根据范围选,最常用 INT,极大数用 BIGINT,小状态用 TINYINT。
-
小数:精确计算(钱)用 DECIMAL,科学计算可用 FLOAT/DOUBLE。
-
字符串:长度变化大用 VARCHAR,绝对固定用 CHAR,大段文本用 TEXT系列。
-
日期时间:记录事件发生时间用 DATETIME;记录数据行变更时间用 TIMESTAMP。
-
黄金法则:在满足需求的前提下,选择最小、最精确、最简单的数据类型。

发表评论
所有评论