马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
MySQL 数据类型详解:字符串、数字、日期
在 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 类型:
数据类型最大存储巨细是否区分巨细写适用场景TINYTEXT255 字节✅ 区分巨细写短文本,如推文内容TEXT65,535 字节(64KB)✅ 区分巨细写文章内容、评论MEDIUMTEXT16,777,215 字节(16MB)✅ 区分巨细写册本、日志记载LONGTEXT4GB✅ 区分巨细写超长文本,如百科条目TINYBLOB255 字节❌ 不区分巨细写小二进制数据,如图片缩略图BLOB64KB❌ 不区分巨细写图片、音频MEDIUMBLOB16MB❌ 不区分巨细写大型媒体文件LONGBLOB4GB❌ 不区分巨细写超大文件,如电影 TEXT vs. VARCHAR
- TEXT 不支持 默认值,也无法使用 索引(仅支持前缀索引),但可以存储大量文本。
- VARCHAR 可以索引整个字段,适用于必要频仍搜索的文本字段。
2. 数字(Numeric)数据类型
数字类型用于存储整数或小数,主要分为整数类型和浮点/定点类型。
2.1 整数类型
数据类型存储巨细取值范围(无符号)适用场景TINYINT1 字节0 ~ 255布尔值(0/1)、评分SMALLINT2 字节0 ~ 65,535小范围数值,如年龄MEDIUMINT3 字节0 ~ 16,777,215适用于 ID、自增字段INT(INTEGER)4 字节0 ~ 4,294,967,295适用于大部门场景,如用户 IDBIGINT8 字节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 提供多个日期时间类型:
数据类型存储巨细取值范围适用场景DATE3 字节1000-01-01 ~ 9999-12-31生日、订单日期DATETIME8 字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59必要准确到秒的时间,如创建时间TIMESTAMP4 字节1970-01-01 00:00:01 ~ 2038-01-19 03:14:07适用于存储 Unix 时间戳TIME3 字节-838:59:59 ~ 838:59:59记载时间隔断YEAR1 字节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 提供了多种数据类型,每种类型都有其适用场景。合理选择数据类型可以提升存储效率、优化查询性能,并避免精度损失。希望这篇文章能帮助你在数据库计划时做出更好的选择! |