数据类型
整数类型
类型 | 字节 | 范围 (有符号) | 范围 (无符号) | 应用场景 |
---|---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 性别、状态位、布尔值 |
SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 年龄、年份、地区编号 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 大一点的 ID 编号 |
INT / INTEGER | 4 | -21亿 ~ 21亿 | 0 ~ 42亿 | 最常用 ID、自增主键 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 金额、大用户量 ID |
👉 注意
- 可以加
UNSIGNED
让范围翻倍(去掉负数部分)。 INT(11)
中的数字 11 不是长度,只是 显示宽度(已废弃)。
INT(M)
的含义:
INT
是整数类型,固定占用 4 个字节。INT(11)
中的(11)
并不是表示该整数可以存储的最大位数,也不是长度。- 它本质上是 显示宽度(display width),用于
ZEROFILL
时控制输出格式。
CREATE TABLE test_width (
id INT(11) ZEROFILL,
score INT(5) ZEROFILL
);
INSERT INTO test_width (id, score) VALUES (1, 45);
SELECT * FROM test_width;
结果为;
id | score |
---|---|
00000000001 | 00045 |
- 可以看到,
INT(11)
的意思是显示 11 位宽度,不足的左侧用 0 填充(因为用了ZEROFILL
)。 - 如果没有
ZEROFILL
,INT(11)
输出和普通INT
一样,没有区别
注意事项
- 不影响存储范围
INT
占用 4 字节,范围-2147483648 ~ 2147483647
(有符号)(11)
不会改变存储大小或范围
- 已废弃
- 从 MySQL 8.0.17 开始,
INT(M)
的显示宽度功能已经 废弃,即使写了(11)
也没有效果。 - 推荐直接写
INT
,如果需要格式化输出,用LPAD()
或应用层处理。
- 从 MySQL 8.0.17 开始,
bit类型
BIT(M)
表示存储 M 位二进制数,M 最大 64。
存储布尔值或标志位:
CREATE TABLE flags (
id INT,
is_active BIT(1), -- 0 或 1
permissions BIT(4) -- 例如 1010
);
-- 二进制插入表示 b'1010' 二进制表示
INSERT INTO bit_test (flags) VALUES (b'1010'), (b'0110');
-- 使用十进制表示
INSERT INTO bit_test (flags) VALUES (10); -- 10 的二进制就是 1010
查询显示问题
-- 默认显示
SELECT * FROM bit_test;
-- 结果可能会显示为 二进制字符或乱码
-- MySQL 将 BIT 类型存储为 二进制字符串,查询时如果客户端使用字符集显示,会显示乱码
转为可读整数
-- 使用 +0 或 BIN()、CAST() 显示
-- 转十进制
SELECT flags+0 AS flags_dec FROM bit_test;
-- 转二进制字符串
SELECT BIN(flags+0) AS flags_bin FROM bit_test;
flags_dec | flags_bin |
---|---|
10 | 1010 |
6 | 0110 |
小数类型
类型 | 存储方式 | 特点 |
---|---|---|
FLOAT | 4字节,单精度 | 约7位精度,可能有误差 |
DOUBLE | 8字节,双精度 | 约15位精度,科学计算用 |
DECIMAL(M,D) | 使用字符串存储 | 精确小数,适合金钱 |
示例:
CREATE TABLE t_double (
d1 double, -- 默认
d2 double(5,2) -- 指定总长度5位,小数部分2位
);
insert into t_double value(2.5,2.5);
CREATE TABLE t_float_double_decimal (
f1 FLOAT, -- 单精度浮点
f2 FLOAT(7,4), -- 7位总长度,小数4位(MySQL旧版本支持)
d1 DOUBLE, -- 双精度浮点
d2 DOUBLE(10,4), -- 总长度10,小数4位
dec1 DECIMAL(10,2) -- 精确小数,总共10位,其中小数2位
);
INSERT INTO t_float_double_decimal (f1, f2, d1, d2, dec1)
VALUES
(123.456789, 123.4567, 123.4567890123, 1234567.1234, 1234567.12),
(0.1, 0.1, 0.1, 0.1, 0.1),
(9999999.9999, 999.9999, 999999999.9999, 9999999.9999, 9999999.99);
SELECT * FROM t_float_double_decimal;
字符串类型
类型 | n 取值范围 | 默认长度 | 存储特点 | 适用场景 |
---|---|---|---|---|
CHAR(n) | 1 ~ 255 | 1 | 固定长度,右填空格 | 身份证号、手机号、性别 |
VARCHAR(n) | 1 ~ 65535 (受行大小限制) | 无默认 | 可变长度 + 长度信息 | 用户名、地址、邮箱、备注 |
CHAR(n)
- 存储:固定长度,长度不足时会用空格填充。
- n 的取值范围:1 ~ 255
- 默认值:如果不指定
n
,MySQL 默认长度是 1。
示例:
CREATE TABLE char_example (
code CHAR(10) -- 定长10个字符
);
INSERT INTO char_example (code) VALUES ('abc');
SELECT CONCAT('[', code, ']') FROM char_example;
-- 结果
-- 特点:适合长度固定的数据,如身份证号、手机号、性别(单字符)等。
[abc ] -- 左对齐,右边补空格
VARCHAR(n)
- 存储:变长,实际长度 + 1 或 2 字节长度信息(用来存放自身的长度)
- 1 字节存储长度:当 n ≤ 255
- 2 字节存储长度:当 n > 255
- n 的取值范围:1 ~ 65535(受行大小限制)
- 默认值:MySQL 不会自动默认长度,需要明确指定。
CREATE TABLE varchar_example (
nickname VARCHAR(50) -- 最多50个字符
);
INSERT INTO varchar_example (nickname) VALUES ('小明');
SELECT nickname, LENGTH(nickname) FROM varchar_example;
-- 结果
-- 特点:节省空间,适合长度不固定的文本,比如用户名、地址、邮箱等
nickname | LENGTH(nickname)
小明 | 2
ENUM
枚举类型
类型 | 取值范围 / 限制 | 默认值 | 存储特点 | 适用场景 |
---|---|---|---|---|
ENUM | 最多 65535 个选项 | 第一个值 | 单选,内部按数字存储 | 性别、状态、类别 |
CREATE TABLE enum_example (
gender ENUM('男','女','未知')
);
INSERT INTO enum_example VALUES ('男'),('女'),('未知');
SELECT gender FROM enum_example;
Set 类型
Set集合类型
- SET 是 MySQL 提供的一种 字符串集合类型。
- 可以存储 一个或多个选项