前言
在 mysql 中,选择合适的数据类型对于数据库的存储效率和查询性能至关重要。mysql 提供了**字符串(string)、数字(numeric)和日期(date & time)**三大类数据类型,每种类型又有不同的子类型,以适应不同的业务需求。
1. 字符串(string)数据类型
字符串类型用于存储文本数据,主要分为定长(char)和变长(varchar),以及大文本(text 和 blob)。
1.1 定长与变长字符串
| 数据类型 | 存储方式 | 特点 | 适用场景 |
|---|---|---|---|
| char(n) | 定长存储(不足补空格) | 访问速度快,占用空间固定 | 适用于固定长度的数据,如国家代码、身份证号 |
| varchar(n) | 变长存储(按需分配空间) | 节省存储空间,但查询时可能需要额外的存储开销 | 适用于长度不固定的文本,如用户昵称、电子邮件 |
char vs. varchar
- char(10) 始终占用 10 个字节(不足补空格)。
- varchar(10) 只存储实际字符,最多 10 个字节,并额外占用 1-2 字节用于存储长度信息。
一般来说:
- 短小、长度固定的文本(如国家代码、md5 哈希)用
char。 - 长度不固定的文本(如姓名、地址)用
varchar。
1.2 text 和 blob
当存储较长的文本或二进制数据时,使用 text 和 blob 类型:
| 数据类型 | 最大存储大小 | 是否区分大小写 | 适用场景 |
|---|---|---|---|
| tinytext | 255 字节 | ✅ 区分大小写 | 短文本,如推文内容 |
| text | 65,535 字节(64kb) | ✅ 区分大小写 | 文章内容、评论 |
| mediumtext | 16,777,215 字节(16mb) | ✅ 区分大小写 | 书籍、日志记录 |
| longtext | 4gb | ✅ 区分大小写 | 超长文本,如百科条目 |
| tinyblob | 255 字节 | ❌ 不区分大小写 | 小二进制数据,如图片缩略图 |
| blob | 64kb | ❌ 不区分大小写 | 图片、音频 |
| mediumblob | 16mb | ❌ 不区分大小写 | 大型媒体文件 |
| longblob | 4gb | ❌ 不区分大小写 | 超大文件,如电影 |
text vs. varchar
text不支持 默认值,也无法使用 索引(仅支持前缀索引),但可以存储大量文本。varchar可以索引整个字段,适用于需要频繁搜索的文本字段。
2. 数字(numeric)数据类型
数字类型用于存储整数或小数,主要分为整数类型和浮点/定点类型。
2.1 整数类型
| 数据类型 | 存储大小 | 取值范围(无符号) | 适用场景 |
|---|---|---|---|
| tinyint | 1 字节 | 0 ~ 255 | 布尔值(0/1)、评分 |
| smallint | 2 字节 | 0 ~ 65,535 | 小范围数值,如年龄 |
| mediumint | 3 字节 | 0 ~ 16,777,215 | 适用于 id、自增字段 |
| int(integer) | 4 字节 | 0 ~ 4,294,967,295 | 适用于大部分场景,如用户 id |
| bigint | 8 字节 | 0 ~ 18,446,744,073,709,551,615 | 适用于超大数值,如银行账户余额 |
无符号(unsigned) vs. 有符号
- 默认情况下整数是有符号的(即支持负数)。
unsigned关键字可以使整数仅存储非负数,从而扩大可用范围。create table users ( id int unsigned auto_increment primary key );
2.2 浮点与定点类型
| 数据类型 | 存储大小 | 适用场景 |
|---|---|---|
| float(m, d) | 4 字节 | 适用于非严格精度的计算,如游戏评分 |
| double(m, d) | 8 字节 | 高精度计算,如科学计算 |
| decimal(m, d)(numeric) | 可变 | 财务计算,避免精度丢失 |
float vs. decimal
- float/double 使用二进制存储,可能导致精度误差:
select 0.1 + 0.2; -- 结果可能不是 0.3
- decimal 采用字符串存储,不会丢失精度:
create table transactions ( amount decimal(10,2) not null );
建议:
- 财务类数据使用 decimal,避免计算误差。
- 非关键计算(如统计数据)可使用 float 或 double。
3. 日期与时间(date & time)
mysql 提供多个日期时间类型:
| 数据类型 | 存储大小 | 取值范围 | 适用场景 |
|---|---|---|---|
| date | 3 字节 | 1000-01-01 ~ 9999-12-31 | 生日、订单日期 |
| datetime | 8 字节 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 需要精确到秒的时间,如创建时间 |
| timestamp | 4 字节 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 适用于存储 unix 时间戳 |
| time | 3 字节 | -838:59:59 ~ 838:59:59 | 记录时间间隔 |
| year | 1 字节 | 1901 ~ 2155 | 适用于年份数据 |
datetime vs. timestamp
- timestamp 受时区影响,适合存储事件发生时间。
- datetime 不受时区影响,适合存储固定时间。
create table events (
event_time timestamp default current_timestamp
);
4. 选择数据类型的最佳实践
- 能用整数就不要用字符串(如性别可用
tinyint)。 - 存储金额、财务数据时,使用 decimal 而非 float。
- 短文本(<255 字符)用 varchar,长文本用 text。
- 索引字段尽量避免 text 和 blob,影响查询性能。
- 时间戳数据尽量使用 timestamp 代替 datetime,节省存储空间。
总结
mysql 提供了多种数据类型,每种类型都有其适用场景。合理选择数据类型可以提升存储效率、优化查询性能,并避免精度损失。希望这篇文章能帮助你在数据库设计时做出更好的选择!
到此这篇关于mysql数据类型之字符串、数字、日期的文章就介绍到这了,更多相关mysql字符串、数字、日期内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论