Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL数值/字符串/日期/枚举集合

MySQL最全数据类型语法及实战详解(数值/字符串/日期/枚举集合)

作者:峥无

数据类型是计算机程序中用来表示数据的类别,它们定义了数据的大小、存储方式和可执行的操作,这篇文章主要介绍了MySQL最全数据类型语法及实战(数值/字符串/日期/枚举集合)的相关资料,需要的朋友可以参考下

本文基于 MySQL 主流版本整理,涵盖所有常用数据类型、使用场景、底层原理、代码实战、易错点、选型建议。

一、前言

数据类型是建表的核心,选错类型会造成:存储空间浪费、查询效率低下、数据越界、精度丢失等问题。MySQL 数据类型主要分为五大类:数值类型、位类型、字符串类型、日期时间类型、枚举&集合类型。下面从分类、语法、实战、易错点逐一讲解。

二、数值类型

数值类型分为整型、浮点型、定点数,支持 UNSIGNED(无符号)修饰符,默认有符号

2.1 整型(TINYINT / SMALLINT / MEDIUMINT / INT / BIGINT)

2.1.1 整型范围与字节对照表

数据类型占用字节有符号范围无符号(UNSIGNED)范围
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
MEDIUMINT3-8388608 ~ 83886070 ~ 16777215
INT(整数)4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT(大整数)8-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615

2.1.2 核心语法 & 代码实战

语法格式:

字段名  整型类型 [UNSIGNED]

示例1:默认有符号 TINYINT(数据越界演示)

-- 创建表,num 为默认有符号 TINYINT
CREATE TABLE test_tinyint(
    num TINYINT
);

-- 正常插入
INSERT INTO test_tinyint VALUES(100);

-- 越界插入(超过最大值127),直接报错
INSERT INTO test_tinyint VALUES(128);

报错说明ERROR 1264 (22003): Out of range value,表示数值超出当前类型定义范围。

示例2:无符号 UNSIGNED 整型

无符号整型不支持负数,最小值从 0 开始:

CREATE TABLE test_tinyint_unsigned(
    num TINYINT UNSIGNED
);

-- 插入负数,越界报错
INSERT INTO test_tinyint_unsigned VALUES(-1);

-- 插入最大值 255,正常执行
INSERT INTO test_tinyint_unsigned VALUES(255);

2.1.3 易错点 & 选型建议

  1. 不推荐滥用 UNSIGNED
    INT 存不下数据,INT UNSIGNED 大概率也存不下,直接升级为 BIGINT 是最优方案。
  2. 场景选型
    • 状态、性别、少量编号:用 TINYINT
    • 普通自增主键、常规数字:用 INT
    • 超大自增ID、长数字:用 BIGINT

2.2 BIT 位类型

2.2.1 语法规则

BIT[(M)]

2.2.2 代码实战

-- 创建表:id 普通整型,a 占8位 BIT
CREATE TABLE test_bit(
    id INT,
    a BIT(8)
);

-- 插入数字 65(ASCII 65 = 大写字母 A)
INSERT INTO test_bit VALUES(1, 65);

-- 查询结果:a 列显示 A,而非 65
SELECT * FROM test_bit;

2.2.3 经典场景:布尔状态(0/1)

仅存储是/否、启用/禁用等二值状态,优先使用 BIT(1),空间最优:

CREATE TABLE test_status(
    is_enable BIT(1)  -- 0=禁用,1=启用
);

INSERT INTO test_status VALUES(0);
INSERT INTO test_status VALUES(1);

-- 插入 2,超出 1 位范围,报错
INSERT INTO test_status VALUES(2);

报错Data too long for column,位数溢出。

2.3 浮点型 FLOAT

2.3.1 语法规则

FLOAT[(M,D)] [UNSIGNED]

2.3.2 范围计算 & 实战

  1. FLOAT(4,2):总长度4,小数2位 → 范围 -99.99 ~ 99.99
  2. FLOAT(6,3):总长度6,小数3位 → 范围 -999.999 ~ 999.999

代码示例:

CREATE TABLE test_float(
    id INT,
    salary FLOAT(4,2)
);

-- 正常数据
INSERT INTO test_float VALUES(1, 99.99);

-- 小数位超出,自动四舍五入
INSERT INTO test_float VALUES(2, 99.991);

SELECT * FROM test_float;

查询结果:99.991 自动变为 99.99

2.3.3 无符号 FLOAT

无符号浮点不允许负数,负数会触发警告并修正:

CREATE TABLE test_float_unsigned(
    salary FLOAT(4,2) UNSIGNED
);

-- 插入负数,触发范围警告
INSERT INTO test_float_unsigned VALUES(-0.1);

2.4 定点数 DECIMAL(高精度小数)

2.4.1 语法规则

DECIMAL[(M,D)] [UNSIGNED]

2.4.2 FLOAT 与 DECIMAL 精度对比(重点)

CREATE TABLE test_decimal(
    id INT,
    num_float FLOAT(10,8),
    num_decimal DECIMAL(10,8)
);

-- 插入同一串高精度小数
INSERT INTO test_decimal VALUES(1, 23.12345612, 23.12345612);

SELECT * FROM test_decimal;

执行结果

2.4.3 选型总结

三、字符串类型

字符串分为定长字符串 CHAR、可变长字符串 VARCHAR、大文本 TEXT、二进制 BLOB,是业务中使用频率最高的类型。

3.1 CHAR 定长字符串

3.1.1 语法 & 特性

CHAR(L)

3.1.2 代码实战

-- 固定存储 2 个字符
CREATE TABLE test_char(
    name CHAR(2)
);

-- 英文、中文都算作 1 个字符
INSERT INTO test_char VALUES('ab');
INSERT INTO test_char VALUES('中国');

-- 定义 CHAR(256) 直接报错,超出最大限制
CREATE TABLE test_char_err(name CHAR(256));

3.1.3 适用场景

数据长度固定的字段优先用 CHAR:

3.2 VARCHAR 可变长字符串

3.2.1 语法 & 底层规则

VARCHAR(L)

3.2.2 代码实战(字符集限制演示)

-- utf8 编码,超过21844 直接报错
CREATE TABLE test_varchar_err(
    name VARCHAR(21845)
) CHARSET=utf8;

-- 合法定义
CREATE TABLE test_varchar(
    name VARCHAR(21844)
) CHARSET=utf8;

-- 中英文混合插入
INSERT INTO test_varchar VALUES('Hello MySQL');
INSERT INTO test_varchar VALUES('我爱编程,热爱技术');

3.2.3 CHAR 和 VARCHAR 对比表

类型存储特点空间利用率查询效率适用场景
CHAR定长,不足补空格固定长度数据
VARCHAR变长,按需分配略低长度不固定数据

3.2.4 适用场景

数据长度不固定:用户名、昵称、地址、简介、备注等。

3.3 TEXT & BLOB 大文本/二进制

  1. TEXT:纯大文本,用于超长内容(文章正文、详情、大段备注)
    • 不支持默认值、部分索引规则和普通字符串不同
  2. BLOB:二进制数据,用于存储图片、文件、音频等二进制流

    开发规范:不建议数据库直接存图片/文件,优先存文件路径。

四、日期时间类型

MySQL 常用三大时间类型:DATEDATETIMETIMESTAMP,业务时间字段必学。

4.1 类型对比

类型格式占用字节时间范围特性
DATEyyyy-MM-dd(仅日期)31000-01-01 ~ 9999-12-31只存年月日
DATETIMEyyyy-MM-dd HH:mm:ss(日期+时间)81000-01-01 ~ 9999-12-31 23:59:59全时间,不受时区严格限制
TIMESTAMPyyyy-MM-dd HH:mm:ss(时间戳)41970-01-01 ~ 2038-01-19自动更新、受时区影响

4.2 代码实战(核心特性:TIMESTAMP 自动刷新)

CREATE TABLE test_time(
    t_date DATE,
    t_datetime DATETIME,
    t_timestamp TIMESTAMP
);

-- 插入数据,timestamp 自动填充当前系统时间
INSERT INTO test_time(t_date, t_datetime) 
VALUES('2026-06-12', '2026-06-12 10:20:30');

-- 更新任意字段,timestamp 会自动刷新为最新时间
UPDATE test_time SET t_date = '2026-01-01';

SELECT * FROM test_time;

4.3 选型建议 & 易错点

  1. 2038 时间坑TIMESTAMP 最大到 2038 年,长期项目优先用 DATETIME
  2. 只需要年月日:用 DATE
  3. 需要精确到时分秒、长期使用:用 DATETIME
  4. 需记录数据最后修改时间:可用 TIMESTAMP 自动更新特性

五、枚举 ENUM & 集合 SET

专门用于固定选项的字段,ENUM 单选、SET 多选,底层以数字存储,效率高。

5.1 ENUM 枚举(单选)

5.1.1 语法

ENUM('选项1','选项2','选项3'...)

5.1.2 实战:性别单选

CREATE TABLE test_enum(
    username VARCHAR(20),
    gender ENUM('男','女','未知')
);

-- 直接写入字符串(推荐,可读性强)
INSERT INTO test_enum VALUES('张三','男');

-- 也可以写数字编号(不推荐),1=男,2=女
INSERT INTO test_enum VALUES('李四',2);

-- 按数字查询
SELECT * FROM test_enum WHERE gender = 2;

5.2 SET 集合(多选)

5.2.1 语法

SET('选项1','选项2','选项3'...)

5.2.2 实战:爱好多选

CREATE TABLE test_set(
    username VARCHAR(20),
    hobby SET('篮球','足球','游泳','跑步')
);

-- 插入多个爱好,逗号分隔
INSERT INTO test_set VALUES('王五','篮球,游泳');
INSERT INTO test_set VALUES('赵六','足球,跑步,篮球');

5.3 SET 专属查询函数 FIND_IN_SET(高频考点)

普通 WHERE 字段='值' 无法查询包含该选项的多条数据,必须使用 FIND_IN_SET(查询值, 字段)

错误写法

-- 只能精准匹配“只有篮球”的数据,查不到同时选篮球+游泳的人
SELECT * FROM test_set WHERE hobby = '篮球';

正确写法(通用查询)

-- 查询所有爱好包含“篮球”的用户(包含多选数据)
SELECT * FROM test_set WHERE FIND_IN_SET('篮球', hobby);

5.4 选型建议

  1. 固定单选(性别、学历、状态):用 ENUM
  2. 固定多选(爱好、标签、权限):用 SET
  3. 选项后期会频繁新增:不要用枚举/集合,改用字典表关联。

六、综合总结 & 开发规范

6.1 类型速选清单

  1. 整数
    • 状态/少量数字:TINYINT
    • 普通ID/编号:INT
    • 超大ID/长整型:BIGINT
    • 二值状态(0/1):BIT(1)
  2. 小数
    • 普通小数:FLOAT
    • 金额/财务/高精度:DECIMAL
  3. 字符串
    • 定长(手机号、身份证):CHAR
    • 变长(姓名、地址):VARCHAR
    • 超长文本(文章):TEXT
  4. 时间
    • 仅日期:DATE
    • 完整时间、长期项目:DATETIME
    • 自动更新修改时间(短期):TIMESTAMP
  5. 固定选项
    • 单选:ENUM
    • 多选标签:SET

6.2 高频易错点汇总

  1. 整型 UNSIGNED 不能存负数,非必要不使用
  2. VARCHAR 最大长度受字符集限制,utf8 最大字符数 21844
  3. BIT 类型按 ASCII 码显示,不直接展示数字
  4. FLOAT 存在精度丢失,金额严禁使用
  5. TIMESTAMP 存在 2038 年限,新项目优先 DATETIME
  6. SET 多选查询必须使用 FIND_IN_SET 函数

七、完整建表示例(综合运用)

-- 综合所有数据类型建表演示
CREATE TABLE user_info(
    id BIGINT PRIMARY KEY AUTO_INCREMENT,  -- 大整数主键
    phone CHAR(11),                       -- 定长手机号
    username VARCHAR(30),                 -- 变长用户名
    age TINYINT UNSIGNED,                 -- 年龄(无符号)
    balance DECIMAL(10,2),                -- 账户金额(高精度)
    gender ENUM('男','女','保密'),        -- 性别枚举
    hobby SET('阅读','运动','游戏'),       -- 爱好集合
    register_date DATE,                   -- 注册日期
    create_time DATETIME,                 -- 创建时间
    is_valid BIT(1)                       -- 启用状态 0/1
);

通过本文的详细讲解和代码示例,相信你对MySQL数据类型已经有了全面而深入的理解。在实际建表时,请根据业务需求、存储效率和查询性能综合权衡,选择最合适的数据类型。

到此这篇关于MySQL数据类型之数值/字符串/日期/枚举集合的文章就介绍到这了,更多相关MySQL数值/字符串/日期/枚举集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文