MySQL 提供了丰富的数据类型来存储不同类型的数据,合理选择数据类型对数据库性能和存储效率至关重要。以下是 MySQL 中字符串、数字和日期时间类型的详细说明。
![图片[1]_MySQL 数据类型详解:字符串、数字与日期类型_知途无界](https://zhituwujie.com/wp-content/uploads/2025/04/d2b5ca33bd20250419100206.png)
一、字符串类型
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. 文本类型
类型 | 最大长度 | 特点 |
---|---|---|
TINYTEXT | 255字节 | 短文本 |
TEXT | 65,535字节 | 常规长度文本 |
MEDIUMTEXT | 16,777,215字节 | 中等长度文本 |
LONGTEXT | 4,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 ~ 127 | 0 ~ 255 | 1字节 |
SMALLINT | -32,768 ~ 32,767 | 0 ~ 65,535 | 2字节 |
MEDIUMINT | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 3字节 |
INT | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 4字节 |
BIGINT | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 8字节 |
使用建议:
- 优先选择能满足需求的最小类型
- 主键推荐使用无符号
BIGINT
或INT
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字节 |
YEAR | YYYY | 1901~2155 | 1字节 |
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’UTC | 4字节 |
关键区别:
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秒');
四、类型选择最佳实践
- 字符串类型:
- 固定长度用
CHAR
,可变长度用VARCHAR
- 超过255字符用
TEXT
系列 - 存储二进制数据用
BLOB
系列
- 数字类型:
- 整数优先选择能满足需求的最小类型
- 金融计算必须使用
DECIMAL
- 科学计算可用
FLOAT
/DOUBLE
- 日期类型:
- 需要时区支持用
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
暂无评论内容