MySQL 数据类型详解:字符串、数字与日期类型

MySQL 提供了丰富的数据类型来存储不同类型的数据,合理选择数据类型对数据库性能和存储效率至关重要。以下是 MySQL 中字符串、数字和日期时间类型的详细说明。

图片[1]_MySQL 数据类型详解:字符串、数字与日期类型_知途无界

一、字符串类型

1. 定长字符串

类型长度范围特点存储需求
CHAR(n)0-255字符固定长度,不足补空格定义长度n个字节
BINARY(n)0-255字节存储二进制数据,固定长度定义长度n个字节

适用场景:存储固定长度的数据(如MD5哈希值、国家代码等)

2. 变长字符串

类型最大长度特点存储需求
VARCHAR(n)65,535字符可变长度,只占用实际需要的空间长度+1或2字节
VARBINARY(n)65,535字节可变长度二进制数据长度+1或2字节

注意

  • VARCHAR会额外使用1-2字节记录长度
  • 实际最大长度受行大小限制(约65,535字节)

3. 文本类型

类型最大长度特点
TINYTEXT255字节短文本
TEXT65,535字节常规长度文本
MEDIUMTEXT16,777,215字节中等长度文本
LONGTEXT4,294,967,295字节超长文本

最佳实践

  • 避免在WHERE子句中使用TEXT列作为条件
  • 大文本考虑使用外部存储+引用方式

4. 枚举与集合

ENUM('small', 'medium', 'large') -- 单选枚举
SET('red', 'green', 'blue') -- 多选集合
ENUM('small', 'medium', 'large')  -- 单选枚举
SET('red', 'green', 'blue')       -- 多选集合
ENUM('small', 'medium', 'large') -- 单选枚举 SET('red', 'green', 'blue') -- 多选集合

二、数字类型

1. 整数类型

类型有符号范围无符号范围存储需求
TINYINT-128 ~ 1270 ~ 2551字节
SMALLINT-32,768 ~ 32,7670 ~ 65,5352字节
MEDIUMINT-8,388,608 ~ 8,388,6070 ~ 16,777,2153字节
INT-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,2954字节
BIGINT-2^63 ~ 2^63-10 ~ 2^64-18字节

使用建议

  • 优先选择能满足需求的最小类型
  • 主键推荐使用无符号BIGINTINT

2. 浮点数类型

类型精度特点
FLOAT约7位有效数字单精度浮点数
DOUBLE约15位有效数字双精度浮点数

注意:浮点数存在精度问题,金融计算应使用DECIMAL

3. 定点数类型

DECIMAL(M,D) -- M总位数,D小数位数
NUMERIC(M,D) -- DECIMAL的同义词
DECIMAL(M,D)  -- M总位数,D小数位数
NUMERIC(M,D)  -- DECIMAL的同义词
DECIMAL(M,D) -- M总位数,D小数位数 NUMERIC(M,D) -- DECIMAL的同义词

特点

  • 精确存储,无精度损失
  • 计算速度比浮点类型慢
  • 最大M=65,D=30

三、日期时间类型

1. 日期类型

类型格式范围存储需求
DATE‘YYYY-MM-DD’‘1000-01-01’~’9999-12-31’3字节
TIME‘HH:MM:SS’‘-838:59:59’~’838:59:59’3字节
YEARYYYY1901~21551字节

2. 日期时间组合

类型格式范围存储需求
DATETIME‘YYYY-MM-DD HH:MM:SS’‘1000-01-01 00:00:00’~’9999-12-31 23:59:59’8字节
TIMESTAMP‘YYYY-MM-DD HH:MM:SS’‘1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’UTC4字节

关键区别

  • TIMESTAMP会转换为UTC存储,检索时转回当前时区
  • DATETIME不带时区信息,存储什么值就返回什么值

3. 日期函数示例

-- 获取当前时间
SELECT NOW(), CURRENT_DATE(), CURRENT_TIME();
-- 日期计算
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH);
SELECT DATEDIFF('2023-12-31', '2023-01-01');
-- 格式化输出
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒');
-- 获取当前时间
SELECT NOW(), CURRENT_DATE(), CURRENT_TIME();

-- 日期计算
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH);
SELECT DATEDIFF('2023-12-31', '2023-01-01');

-- 格式化输出
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒');
-- 获取当前时间 SELECT NOW(), CURRENT_DATE(), CURRENT_TIME(); -- 日期计算 SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH); SELECT DATEDIFF('2023-12-31', '2023-01-01'); -- 格式化输出 SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒');

四、类型选择最佳实践

  1. 字符串类型
  • 固定长度用CHAR,可变长度用VARCHAR
  • 超过255字符用TEXT系列
  • 存储二进制数据用BLOB系列
  1. 数字类型
  • 整数优先选择能满足需求的最小类型
  • 金融计算必须使用DECIMAL
  • 科学计算可用FLOAT/DOUBLE
  1. 日期类型
  • 需要时区支持用TIMESTAMP
  • 大范围日期用DATETIME
  • 只需要日期部分用DATE

五、常见问题解答

Q1:VARCHAR(255)和VARCHAR(256)有什么区别?
A:超过255字符需要额外1字节存储长度信息,但实际性能差异可以忽略

Q2:ENUM和SET如何选择?
A:ENUM适合单选(如性别),SET适合多选(如用户兴趣标签)

Q3:TIMESTAMP的2038年问题如何解决?
A:MySQL 8.0已支持更大的时间范围,或使用DATETIME替代

Q4:存储手机号应该用什么类型?
A:推荐VARCHAR(20),因为可能有国际区号且不需要数学计算

通过合理选择数据类型,可以显著提升数据库性能和存储效率。建议在设计表结构时充分考虑业务需求和数据特性,避免后期修改数据类型带来的迁移成本。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞82 分享
Give light and people will find the way.
照亮前方的路,路就会被找到
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容