| 类型 | 字节 | 有符号范围 | 无符号范围 |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
计算公式:
CREATE TABLE integer_types (
id INT PRIMARY KEY AUTO_INCREMENT,
age TINYINT UNSIGNED,
score SMALLINT,
population MEDIUMINT,
world_population BIGINT
);
INSERT INTO integer_types (age, score, population, world_population)
VALUES (25, 95, 500000, 7900000000);
SELECT * FROM integer_types;
语法格式:
INT(M)
参数说明:
示例:
CREATE TABLE display_width (
id INT(5) ZEROFILL,
num INT(10) ZEROFILL
);
INSERT INTO display_width VALUES (123, 456);
SELECT * FROM display_width;
输出:
+-------+------------+
| id | num |
+-------+------------+
| 00123 | 0000000456 |
+-------+------------+
特点:
示例:
CREATE TABLE auto_increment_test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
INSERT INTO auto_increment_test (name) VALUES ('张三');
INSERT INTO auto_increment_test (name) VALUES ('李四');
INSERT INTO auto_increment_test (name) VALUES ('王五');
SELECT * FROM auto_increment_test;
输出:
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+----+--------+
CREATE TABLE auto_increment_start (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) AUTO_INCREMENT = 1000;
INSERT INTO auto_increment_start (name) VALUES ('测试');
SELECT * FROM auto_increment_start;
输出:
+------+--------+
| id | name |
+------+--------+
| 1000 | 测试 |
+------+--------+
| 类型 | 字节 | 说明 |
|---|---|---|
| FLOAT | 4 | 单精度浮点数 |
| DOUBLE | 8 | 双精度浮点数 |
| DECIMAL | 可变 | 定点数,精确计算 |
FLOAT:
DOUBLE:
DECIMAL:
DECIMAL(M, D)
参数说明:
示例:
CREATE TABLE decimal_test (
id INT PRIMARY KEY,
price DECIMAL(10, 2),
rate DECIMAL(5, 3)
);
INSERT INTO decimal_test VALUES (1, 12345.67, 0.125);
SELECT * FROM decimal_test;
输出:
+----+----------+-------+
| id | price | rate |
+----+----------+-------+
| 1 | 12345.67 | 0.125 |
+----+----------+-------+
使用DECIMAL:
CREATE TABLE money_test (
id INT PRIMARY KEY,
amount DECIMAL(10, 2)
);
INSERT INTO money_test VALUES (1, 0.1), (2, 0.2);
SELECT SUM(amount) FROM money_test;
输出:
+-------------+
| SUM(amount) |
+-------------+
| 0.30 |
+-------------+
使用FLOAT(精度丢失):
CREATE TABLE float_test (
id INT PRIMARY KEY,
amount FLOAT
);
INSERT INTO float_test VALUES (1, 0.1), (2, 0.2);
SELECT SUM(amount) FROM float_test;
输出:
+-------------+
| SUM(amount) |
+-------------+
| 0.3000000 |
+-------------+
选择建议:
| 类型 | 说明 | 存储特点 |
|---|---|---|
| CHAR(N) | 定长字符串 | 固定N字节,不足补空格 |
| VARCHAR(N) | 变长字符串 | 实际长度+1或2字节 |
特点:
示例:
CREATE TABLE char_test (
id INT PRIMARY KEY,
code CHAR(10)
);
INSERT INTO char_test VALUES (1, 'ABC');
SELECT id, code, LENGTH(code), CHAR_LENGTH(code) FROM char_test;
输出:
+----+------------+--------------+-------------------+
| id | code | LENGTH(code) | CHAR_LENGTH(code) |
+----+------------+--------------+-------------------+
| 1 | ABC | 10 | 10 |
+----+------------+--------------+-------------------+
特点:
示例:
CREATE TABLE varchar_test (
id INT PRIMARY KEY,
name VARCHAR(50),
description VARCHAR(255)
);
INSERT INTO varchar_test VALUES (1, '张三', '这是一个测试描述');
SELECT id, name, LENGTH(name), CHAR_LENGTH(name) FROM varchar_test;
输出:
+----+--------+--------------+-------------------+
| id | name | LENGTH(name) | CHAR_LENGTH(name) |
+----+--------+--------------+-------------------+
| 1 | 张三 | 6 | 2 |
+----+--------+--------------+-------------------+
VARCHAR存储需求:
示例:
| 类型 | 最大长度 | 存储需求 |
|---|---|---|
| TINYTEXT | 255字节 | 1字节 |
| TEXT | 65535字节 | 2字节 |
| MEDIUMTEXT | 16MB | 3字节 |
| LONGTEXT | 4GB | 4字节 |
CREATE TABLE text_test (
id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
article MEDIUMTEXT
);
INSERT INTO text_test (id, title, content)
VALUES (1, '文章标题', '这是一段较长的文本内容...');
语法格式:
ENUM('值1', '值2', '值3', ...)
特点:
示例:
CREATE TABLE enum_test (
id INT PRIMARY KEY,
status ENUM('待审核', '已发布', '已下线'),
gender ENUM('男', '女', '保密')
);
INSERT INTO enum_test VALUES (1, '待审核', '男');
SELECT id, status, status+0 FROM enum_test;
输出:
+----+-----------+----------+
| id | status | status+0 |
+----+-----------+----------+
| 1 | 待审核 | 1 |
+----+-----------+----------+
语法格式:
SET('值1', '值2', '值3', ...)
特点:
示例:
CREATE TABLE set_test (
id INT PRIMARY KEY,
hobbies SET('阅读', '运动', '音乐', '旅行', '游戏')
);
INSERT INTO set_test VALUES (1, '阅读,运动,音乐');
SELECT id, hobbies FROM set_test;
输出:
+----+-------------------+
| id | hobbies |
+----+-------------------+
| 1 | 阅读,运动,音乐 |
+----+-------------------+
| 类型 | 格式 | 范围 | 存储需求 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 3字节 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3字节 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8字节 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 4字节 |
| YEAR | YYYY | 1901 ~ 2155 | 1字节 |
标准格式:YYYY-MM-DD
示例:
CREATE TABLE date_test (
id INT PRIMARY KEY,
birth_date DATE,
hire_date DATE
);
INSERT INTO date_test VALUES (1, '1990-05-15', '2020-03-20');
SELECT * FROM date_test;
-- 当前日期
SELECT CURDATE();
-- 日期计算
SELECT DATE_ADD('2024-01-01', INTERVAL 7 DAY);
SELECT DATE_SUB('2024-01-01', INTERVAL 1 MONTH);
-- 日期差值
SELECT DATEDIFF('2024-12-31', '2024-01-01');
-- 提取日期部分
SELECT YEAR('2024-05-20');
SELECT MONTH('2024-05-20');
SELECT DAY('2024-05-20');
标准格式:HH:MM:SS
示例:
CREATE TABLE time_test (
id INT PRIMARY KEY,
start_time TIME,
duration TIME
);
INSERT INTO time_test VALUES (1, '09:00:00', '08:30:00');
SELECT * FROM time_test;
-- 当前时间
SELECT CURTIME();
-- 时间计算
SELECT TIME_ADD('10:00:00', INTERVAL 30 MINUTE);
SELECT TIME_SUB('10:00:00', INTERVAL 1 HOUR);
-- 时间差值
SELECT TIMEDIFF('18:00:00', '09:00:00');
-- 提取时间部分
SELECT HOUR('10:30:45');
SELECT MINUTE('10:30:45');
SELECT SECOND('10:30:45');
标准格式:YYYY-MM-DD HH:MM:SS
示例:
CREATE TABLE datetime_test (
id INT PRIMARY KEY,
create_time DATETIME,
update_time DATETIME
);
INSERT INTO datetime_test VALUES (1, '2024-05-20 10:30:00', '2024-05-20 15:45:00');
SELECT * FROM datetime_test;
-- 当前日期时间
SELECT NOW();
SELECT SYSDATE();
-- 日期时间计算
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);
-- 格式化
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s');
特点:
示例:
CREATE TABLE timestamp_test (
id INT PRIMARY KEY,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO timestamp_test (id) VALUES (1);
SELECT * FROM timestamp_test;
-- 插入数据时自动设置
INSERT INTO timestamp_test (id) VALUES (2);
-- 更新数据时自动更新
UPDATE timestamp_test SET id = 3 WHERE id = 2;
格式:YYYY
示例:
CREATE TABLE year_test (
id INT PRIMARY KEY,
birth_year YEAR
);
INSERT INTO year_test VALUES (1, 1990);
SELECT * FROM year_test;
CREATE TABLE json_test (
id INT PRIMARY KEY,
data JSON
);
INSERT INTO json_test VALUES
(1, '{"name": "张三", "age": 25, "hobbies": ["阅读", "运动"]}'),
(2, '{"name": "李四", "age": 30, "city": "北京"}');
-- 提取字段
SELECT id, data->>'$.name' AS name, data->>'$.age' AS age
FROM json_test;
-- 提取数组元素
SELECT id, data->'$.hobbies[0]' AS first_hobby
FROM json_test;
-- 创建JSON
SELECT JSON_OBJECT('name', '王五', 'age', 28);
-- 合并JSON
SELECT JSON_MERGE_PRESERVE(
'{"name": "张三"}',
'{"age": 25}'
);
-- 设置值
SELECT JSON_SET('{"name": "张三"}', '$.age', 25);
-- 删除值
SELECT JSON_REMOVE('{"name": "张三", "age": 25}', '$.age');
-- 查找路径
SELECT JSON_CONTAINS_PATH('{"name": "张三"}', 'one', '$.name');
| 类型 | 说明 | 最大长度 |
|---|---|---|
| BINARY(N) | 定长二进制 | 255字节 |
| VARBINARY(N) | 变长二进制 | 65535字节 |
| TINYBLOB | 小型BLOB | 255字节 |
| BLOB | 常规BLOB | 65KB |
| MEDIUMBLOB | 中型BLOB | 16MB |
| LONGBLOB | 大型BLOB | 4GB |
CREATE TABLE blob_test (
id INT PRIMARY KEY,
file_name VARCHAR(100),
file_data MEDIUMBLOB
);
-- 插入二进制数据
INSERT INTO blob_test (id, file_name, file_data)
VALUES (1, 'test.jpg', LOAD_FILE('/path/to/test.jpg'));
SELECT id, file_name, LENGTH(file_data) AS file_size
FROM blob_test;
错误示例:
CREATE TABLE bad_design (
id VARCHAR(50) PRIMARY KEY,
age VARCHAR(10),
price VARCHAR(20)
);
正确示例:
CREATE TABLE good_design (
id INT PRIMARY KEY AUTO_INCREMENT,
age TINYINT UNSIGNED,
price DECIMAL(10, 2)
);
过度设计:
CREATE TABLE over_design (
id BIGINT PRIMARY KEY,
name VARCHAR(1000),
description LONGTEXT
);
合理设计:
CREATE TABLE reasonable_design (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
description TEXT
);
✅ 整数类型根据范围选择 ✅ 货币金额使用DECIMAL ✅ 字符串根据长度选择CHAR或VARCHAR ✅ 时间类型根据需求选择 ✅ JSON类型支持原生JSON操作
完成本章学习后,请确认您能够: