mysql菜鸟教程

首页 >> 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 ('男', '读书,旅游');

注意ENUMSET在数据库设计中需谨慎使用,因为它们不易维护(修改选项需改表结构),且可移植性较差。有时用关联表或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文档,便于灵活扩展。

  • 二进制类型 (BINARYVARBINARYBLOB): 类似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等外键,这里仅为数据类型示例。
);

总结

  1. 整数:根据范围选,最常用 INT,极大数用 BIGINT,小状态用 TINYINT

  2. 小数精确计算(钱)用 DECIMAL,科学计算可用 FLOAT/DOUBLE

  3. 字符串长度变化大用 VARCHAR,绝对固定用 CHAR,大段文本用 TEXT系列。

  4. 日期时间:记录事件发生时间用 DATETIME;记录数据行变更时间用 TIMESTAMP

  5. 黄金法则:在满足需求的前提下,选择最小、最精确、最简单的数据类型


发表评论

昵称:
联系方式:
评论内容:

所有评论

关于我 备案号:蜀ICP备2023042032号-1