数值类型
有符号整数
| 类型 |
字节 |
最小值 |
最大值 |
说明 |
| TINYINT |
1 |
-128 |
127 |
微小整数 |
| SMALLINT |
2 |
-32768 |
32767 |
小整数 |
| MEDIUMINT |
3 |
-8388608 |
8388607 |
中等整数 |
| INT/INTEGER |
4 |
-2147483648 |
2147483647 |
标准整数 |
| BIGINT |
8 |
-2^63 |
2^63-1 |
大整数 |
无符号整数
| 类型 |
字节 |
最小值 |
最大值 |
| TINYINT UNSIGNED |
1 |
0 |
255 |
| SMALLINT UNSIGNED |
2 |
0 |
65535 |
| MEDIUMINT UNSIGNED |
3 |
0 |
16777215 |
| INT UNSIGNED |
4 |
0 |
4294967295 |
| BIGINT UNSIGNED |
8 |
0 |
2^64-1 |
注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不 下,与其如此,还不如设计时,将int类型提升为bigint类型。
示例
复制代码
-- 有符号整数
age TINYINT, -- -128 到 127
user_id INT, -- 普通用户ID
price INT, -- 价格(分)
-- 无符号整数
age TINYINT UNSIGNED, -- 0 到 255
post_id BIGINT UNSIGNED, -- 大范围ID
views INT UNSIGNED, -- 访问量,不会为负
浮点类型
浮点数
| 类型 |
字节 |
精度 |
说明 |
| FLOAT |
4 |
单精度 |
约 7 位有效数字 |
| DOUBLE |
8 |
双精度 |
约 15 位有效数字 |
定点数
| 类型 |
说明 |
格式 |
| DECIMAL |
精确小数 |
DECIMAL(M, D) |
| NUMERIC |
DECIMAL 的别名 |
同 DECIMAL |
参数说明
M:总位数(精度),1-65
D:小数位数,0-30
字符串类型
| 类型 |
最大长度 |
说明 |
存储方式 |
| CHAR |
255 字符 |
定长字符串 |
固定长度 |
| VARCHAR |
65535 字节 |
变长字符串 |
实际长度 + 1/2 字节 |
| BINARY |
255 字节 |
定长二进制 |
二进制数据 |
| VARBINARY |
65535 字节 |
变长二进制 |
二进制数据 |
bit类型
复制代码
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
枚举和集合
ENUM类型
复制代码
-- 枚举:单选
status ENUM('active', 'inactive', 'pending'),
gender ENUM('M', 'F', 'U'), -- Male/Female/Unknown
priority ENUM('low', 'medium', 'high', 'critical')
-- 存储为数字索引(1开始)
-- 查询时可用字符串或数字
SELECT * FROM table WHERE status = 'active';
SELECT * FROM table WHERE status = 1; -- 等效
SET类型
复制代码
-- 集合:多选(最多64个值)
tags SET('news', 'tech', 'sports', 'entertainment'),
permissions SET('read', 'write', 'delete', 'admin')
-- 使用示例
INSERT INTO posts (tags) VALUES ('news,tech');
INSERT INTO users (permissions) VALUES ('read,write');
-- 查询包含某个值
SELECT * FROM posts WHERE FIND_IN_SET('news', tags) > 0;
SELECT * FROM users WHERE permissions LIKE '%read%';
集合查询使用find_ in_ set函数: find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串。
示例
复制代码
select find_in_set('a', 'a,b,c');
select * from votes where find_in_set('登山', hobby);
日期时间类型
| 类型 |
格式 |
范围 |
字节 |
说明 |
| DATE |
YYYY-MM-DD |
1000-01-01 到 9999-12-31 |
3 |
日期 |
| TIME |
HH:MM:SS[.fraction] |
-838:59:59 到 838:59:59 |
3 |
时间 |
| DATETIME |
YYYY-MM-DD HH:MM:SS[.fraction] |
1000-01-01 00:00:00 到 9999-12-31 23:59:59 |
8 |
日期时间 |
| TIMESTAMP |
YYYY-MM-DD HH:MM:SS[.fraction] |
1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC |
4 |
时间戳 |
| YEAR |
YYYY |
1901 到 2155 |
1 |
年份 |
示例
复制代码
-- 日期时间字段
birth_date DATE, -- 生日
meeting_time TIME, -- 会议时间
created_at DATETIME, -- 创建时间(不会自动更新)
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 更新时间
published_year YEAR, -- 出版年份
-- 带小数秒的精度
log_time DATETIME(6), -- 微秒精度
transaction_time TIMESTAMP(3) -- 毫秒精度
总结
| 数据类型 |
推荐用途 |
示例 |
| TINYINT |
状态、标志位 |
status TINYINT(1) |
| INT |
ID、计数 |
id INT UNSIGNED |
| BIGINT |
大数字 ID |
order_id BIGINT UNSIGNED |
| DECIMAL |
金额、精确计算 |
price DECIMAL(10,2) |
| VARCHAR |
变长字符串 |
name VARCHAR(50) |
| CHAR |
定长编码 |
uuid CHAR(36) |
| TEXT |
长文本 |
content TEXT |
| DATETIME |
时间记录 |
created_at DATETIME |
| TIMESTAMP |
更新时间 |
updated_at TIMESTAMP |
| JSON |
结构化数据 |
attributes JSON |
| BOOLEAN |
布尔值 |
is_active BOOLEAN |