MySQL有哪些数据类型?MySQL 数据类型是数据库设计中非常基础和重要的概念,选择合适的数据类型对于优化存储空间、提升查询性能和数据准确性都至关重要。
MySQL 数据类型主要分为三大类:数值类型、字符串(文本)类型、日期/时间类型。此外,还有两种现代且常用的特殊类型。
一、 数值类型
数值类型用于存储数字,分为整数类型和浮点数(小数)类型。
类型 |
大小 |
有符号范围 (SIGNED) |
无符号范围 (UNSIGNED) |
用途 |
TINYINT |
1 byte |
(-128, 127) |
(0, 255) |
小范围数值,如状态码 (0, 1)、年龄 |
SMALLINT |
2 bytes |
(-32,768, 32,767) |
(0, 65,535) |
较小范围数值 |
MEDIUMINT |
3 bytes |
(-8,388,608, 8,388,607) |
(0, 16,777,215) |
中等范围数值 |
INT |
4 bytes |
(-2,147,483,648, 2,147,483,647) |
(0, 4,294,967,295) |
标准的整数,常用。如用户ID、数量 |
BIGINT |
8 bytes |
(±9.22e+18) |
(0, 18,446,744,073,709,551,615) |
大范围数值,如大数据量、金融交易号 |
最佳实践:选择类型时,在满足需求的前提下尽可能使用最小的数据类型。例如,age 字段用 TINYINT UNSIGNED 就足够了。
类型 |
大小 |
用途 |
FLOAT(M, D) |
4 bytes |
单精度浮点数。M 是总位数,D 是小数点后的位数。 |
DOUBLE(M, D) |
8 bytes |
双精度浮点数。精度比 FLOAT 更高。 |
类型 |
大小 |
用途 |
DECIMAL(M, D) |
变长 |
精确的小数。M 是总位数(精度,最大65),D 是小数点后的位数(标度,最大30)。例如 DECIMAL(10, 2) 可以存储 12345678.12。 |
FLOAT/DOUBLE vs DECIMAL:追求性能(计算速度)用 FLOAT/DOUBLE,追求精确性(无舍入误差)用 DECIMAL。
二、 字符串类型
字符串类型用于存储文本、二进制数据(如图片、文件)等。
类型 |
大小 |
用途 |
CHAR(N) |
0 - 255 bytes |
定长字符串。无论实际内容多少,都会占用 N 个字符定义的长度。适合存储长度几乎固定的数据,如MD5哈希值(32)、国家代码(2)、UUID(36)。存取速度比 VARCHAR 快。 |
VARCHAR(N) |
0 - 65,535 bytes |
变长字符串。只用必要的空间来存储字符串(+1或+2字节用来记录长度)。适合存储长度变化较大的数据,如姓名、地址、文章标题。N 是字符的最大数量。 |
BINARY(N) |
0 - 255 bytes |
类似 CHAR,但存储的是二进制字节串,而非字符串。 |
VARBINARY(N) |
0 - 65,535 bytes |
类似 VARCHAR,但存储的是二进制字节串。 |
CHAR vs VARCHAR:长度固定用 CHAR,长度变化大用 VARCHAR。
类型 |
大小 |
用途 |
TINYTEXT / TINYBLOB |
最大 255 bytes |
短文本或二进制数据 |
TEXT / BLOB |
最大 64 KB |
文本内容(如长文章、日志)或二进制数据(如图片、PDF小文件) |
MEDIUMTEXT / MEDIUMBLOB |
最大 16 MB |
更大的文本或二进制数据 |
LONGTEXT / LONGBLOB |
最大 4 GB |
极大的文本或二进制数据 |
注意:通常不建议将大型文件直接存入数据库,而是将文件存储在文件系统或对象存储(如AWS S3)中,然后在数据库中只保存文件的路径或URL。
三、 日期与时间类型
类型 |
格式 |
范围 |
用途 |
DATE |
YYYY-MM-DD |
1000-01-01 to 9999-12-31 |
仅存储日期,如生日、创建日期。 |
TIME |
HH:MM:SS[.fraction] |
-838:59:59.000000 to 838:59:59.000000 |
存储时间或时间间隔。 |
DATETIME |
YYYY-MM-DD HH:MM:SS[.fraction] |
1000-01-01 00:00:00 to 9999-12-31 23:59:59 |
存储日期和时间。与时区无关,显示的值与写入的值一致。 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS[.fraction] |
1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC |
存储时间戳(从’1970-01-01’开始的秒数)。与时区有关,存入和查询时会根据会话时区进行转换。占用4字节,比 DATETIME(8字节)更省空间。但有 2038年问题。 |
YEAR |
YYYY |
1901 to 2155 |
存储年份值。 |
DATETIME vs TIMESTAMP: 需要范围更大、与时区无关,用 DATETIME。 需要自动记录行更新时间、节省空间、与时区相关,用 TIMESTAMP。常定义为 UPDATE CURRENT_TIMESTAMP。
四、 特殊类型
CREATE TABLE user ( id INT, profile JSON -- 存储用户的JSON配置信息 ); INSERT INTO user VALUES (1, '{"name": "John", "hobbies": ["reading", "coding"]}');
总结与选择建议
示例表结构:
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 无符号自增主键 `username` VARCHAR(50) NOT NULL UNIQUE, -- 变长用户名 `age` TINYINT UNSIGNED NULL, -- 小范围无符号年龄 `balance` DECIMAL(10, 2) NOT NULL DEFAULT '0.00', -- 精确的账户余额 `avatar_url` VARCHAR(255) NULL, -- 存储头像链接,而非图片本身 `status` ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active', -- 枚举状态 `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 自动记录创建时间 `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自动更新 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。