本文档风哥主要介绍MariaDB的数据类型选型与业务场景最佳实践,包括各种数据类型的特点、适用场景、性能影响等内容。风哥教程参考MariaDB官方文档Data Types内容,适合数据库管理员和开发人员学习。
Part01-基础概念与理论知识
1.1 数据类型概述
MariaDB支持多种数据类型,每种类型都有其特定的存储方式和使用场景:
- 数值类型:整型、浮点型、 decimal
- 字符串类型:CHAR、VARCHAR、TEXT等
- 日期时间类型:DATE、TIME、DATETIME、TIMESTAMP
- 特殊类型:ENUM、SET、JSON等
1.2 数据类型分类
MariaDB数据类型主要分为以下几类:
- 数值类型:INT、BIGINT、FLOAT、DOUBLE、DECIMAL等
- 字符串类型:CHAR、VARCHAR、TEXT、BLOB等
- 日期时间类型:DATE、TIME、DATETIME、TIMESTAMP、YEAR等
- 空间类型:GEOMETRY、POINT、LINESTRING等
- JSON类型:用于存储JSON数据
1.3 选型原则
数据类型选型的基本原则:
- 选择最小的可用类型
- 选择最精确的类型
- 考虑存储空间
- 考虑查询性能
- 考虑业务需求
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 数据类型选择
风哥提示:生产环境数据类型选择应根据业务需求、数据量大小和查询性能要求进行综合考虑。
2.2 性能考虑
性能考虑因素:
- 数据类型大小:越小的类型性能越好
- 索引效率:某些类型更适合创建索引
- 查询速度:不同类型的查询速度不同
- 存储引擎:不同存储引擎对数据类型的支持不同
2.3 存储考虑
存储考虑因素:
- 存储空间:选择合适的类型减少存储占用
- 数据精度:确保数据精度满足业务需求
- 数据完整性:选择合适的类型保证数据完整性
- 可扩展性:考虑未来数据增长
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 数值类型
更多学习教程公众号风哥教程itpux_com
# 数值类型示例
# 整型
CREATE TABLE fgedu_numeric (
id INT PRIMARY KEY AUTO_INCREMENT, — 4字节,范围:-2147483648 到 2147483647
big_id BIGINT, — 8字节,范围:-9223372036854775808 到 9223372036854775807
small_id SMALLINT, — 2字节,范围:-32768 到 32767
tiny_id TINYINT, — 1字节,范围:-128 到 127
unsigned_int INT UNSIGNED, — 无符号整型,范围:0 到 4294967295
unsigned_bigint BIGINT UNSIGNED — 无符号大整型,范围:0 到 18446744073709551615
);
# 浮点型
CREATE TABLE fgedu_float (
id INT PRIMARY KEY AUTO_INCREMENT,
float_col FLOAT(10,2), — 单精度浮点数,精度约7位
double_col DOUBLE(10,2), — 双精度浮点数,精度约15位
decimal_col DECIMAL(10,2) — 定点数,精度精确
);
# 整型
CREATE TABLE fgedu_numeric (
id INT PRIMARY KEY AUTO_INCREMENT, — 4字节,范围:-2147483648 到 2147483647
big_id BIGINT, — 8字节,范围:-9223372036854775808 到 9223372036854775807
small_id SMALLINT, — 2字节,范围:-32768 到 32767
tiny_id TINYINT, — 1字节,范围:-128 到 127
unsigned_int INT UNSIGNED, — 无符号整型,范围:0 到 4294967295
unsigned_bigint BIGINT UNSIGNED — 无符号大整型,范围:0 到 18446744073709551615
);
# 浮点型
CREATE TABLE fgedu_float (
id INT PRIMARY KEY AUTO_INCREMENT,
float_col FLOAT(10,2), — 单精度浮点数,精度约7位
double_col DOUBLE(10,2), — 双精度浮点数,精度约15位
decimal_col DECIMAL(10,2) — 定点数,精度精确
);
3.2 字符串类型
# 字符串类型示例
CREATE TABLE fgedu_string (
id INT PRIMARY KEY AUTO_INCREMENT,
char_col CHAR(10), — 固定长度字符串,最大255字符
varchar_col VARCHAR(255), — 可变长度字符串,最大65535字符
text_col TEXT, — 文本类型,最大65535字符
mediumtext_col MEDIUMTEXT, — 中等文本,最大16777215字符
longtext_col LONGTEXT, — 长文本,最大4294967295字符
blob_col BLOB, — 二进制大对象,最大65535字节
mediumblob_col MEDIUMBLOB, — 中等二进制对象,最大16777215字节
longblob_col LONGBLOB — 长二进制对象,最大4294967295字节
);
CREATE TABLE fgedu_string (
id INT PRIMARY KEY AUTO_INCREMENT,
char_col CHAR(10), — 固定长度字符串,最大255字符
varchar_col VARCHAR(255), — 可变长度字符串,最大65535字符
text_col TEXT, — 文本类型,最大65535字符
mediumtext_col MEDIUMTEXT, — 中等文本,最大16777215字符
longtext_col LONGTEXT, — 长文本,最大4294967295字符
blob_col BLOB, — 二进制大对象,最大65535字节
mediumblob_col MEDIUMBLOB, — 中等二进制对象,最大16777215字节
longblob_col LONGBLOB — 长二进制对象,最大4294967295字节
);
3.3 日期时间类型
# 日期时间类型示例
CREATE TABLE fgedu_datetime (
id INT PRIMARY KEY AUTO_INCREMENT,
date_col DATE, — 日期,格式:YYYY-MM-DD
time_col TIME, — 时间,格式:HH:MM:SS
datetime_col DATETIME, — 日期时间,格式:YYYY-MM-DD HH:MM:SS
timestamp_col TIMESTAMP, — 时间戳,格式:YYYY-MM-DD HH:MM:SS
year_col YEAR — 年份,格式:YYYY
);
CREATE TABLE fgedu_datetime (
id INT PRIMARY KEY AUTO_INCREMENT,
date_col DATE, — 日期,格式:YYYY-MM-DD
time_col TIME, — 时间,格式:HH:MM:SS
datetime_col DATETIME, — 日期时间,格式:YYYY-MM-DD HH:MM:SS
timestamp_col TIMESTAMP, — 时间戳,格式:YYYY-MM-DD HH:MM:SS
year_col YEAR — 年份,格式:YYYY
);
3.4 特殊类型
# 特殊类型示例
CREATE TABLE fgedu_special (
id INT PRIMARY KEY AUTO_INCREMENT,
enum_col ENUM(‘male’, ‘female’, ‘other’), — 枚举类型
set_col SET(‘red’, ‘green’, ‘blue’), — 集合类型
json_col JSON, — JSON类型
geometry_col GEOMETRY — 空间类型
);
CREATE TABLE fgedu_special (
id INT PRIMARY KEY AUTO_INCREMENT,
enum_col ENUM(‘male’, ‘female’, ‘other’), — 枚举类型
set_col SET(‘red’, ‘green’, ‘blue’), — 集合类型
json_col JSON, — JSON类型
geometry_col GEOMETRY — 空间类型
);
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 数值类型实战
# 实战示例:数值类型应用
CREATE TABLE fgedu_products (
product_id INT PRIMARY KEY AUTO_INCREMENT, — 商品ID,使用INT
price DECIMAL(10,2) NOT NULL, — 价格,使用DECIMAL保证精度
stock INT UNSIGNED DEFAULT 0, — 库存,使用无符号整型
weight FLOAT(8,2), — 重量,使用FLOAT
rating DOUBLE(3,2), — 评分,使用DOUBLE
category_id SMALLINT, — 分类ID,使用SMALLINT
status TINYINT DEFAULT 1 — 状态,使用TINYINT
);
INSERT INTO fgedu_products (price, stock, weight, rating, category_id, status) VALUES
(99.99, 100, 1.5, 4.5, 1, 1),
(199.99, 50, 2.0, 4.8, 2, 1),
(299.99, 30, 3.5, 4.9, 1, 1);
SELECT * FROM fgedu_products;
+————+——–+——-+——–+——–+————-+——–+
| product_id | price | stock | weight | rating | category_id | status |
+————+——–+——-+——–+——–+————-+——–+
| 1 | 99.99 | 100 | 1.5 | 4.5 | 1 | 1 |
| 2 | 199.99 | 50 | 2.0 | 4.8 | 2 | 1 |
| 3 | 299.99 | 30 | 3.5 | 4.9 | 1 | 1 |
+————+——–+——-+——–+——–+————-+——–+
CREATE TABLE fgedu_products (
product_id INT PRIMARY KEY AUTO_INCREMENT, — 商品ID,使用INT
price DECIMAL(10,2) NOT NULL, — 价格,使用DECIMAL保证精度
stock INT UNSIGNED DEFAULT 0, — 库存,使用无符号整型
weight FLOAT(8,2), — 重量,使用FLOAT
rating DOUBLE(3,2), — 评分,使用DOUBLE
category_id SMALLINT, — 分类ID,使用SMALLINT
status TINYINT DEFAULT 1 — 状态,使用TINYINT
);
INSERT INTO fgedu_products (price, stock, weight, rating, category_id, status) VALUES
(99.99, 100, 1.5, 4.5, 1, 1),
(199.99, 50, 2.0, 4.8, 2, 1),
(299.99, 30, 3.5, 4.9, 1, 1);
SELECT * FROM fgedu_products;
+————+——–+——-+——–+——–+————-+——–+
| product_id | price | stock | weight | rating | category_id | status |
+————+——–+——-+——–+——–+————-+——–+
| 1 | 99.99 | 100 | 1.5 | 4.5 | 1 | 1 |
| 2 | 199.99 | 50 | 2.0 | 4.8 | 2 | 1 |
| 3 | 299.99 | 30 | 3.5 | 4.9 | 1 | 1 |
+————+——–+——-+——–+——–+————-+——–+
4.2 字符串类型实战
# 实战示例:字符串类型应用
CREATE TABLE fgedu_users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL, — 用户名,使用VARCHAR
email VARCHAR(100) UNIQUE NOT NULL, — 邮箱,使用VARCHAR
password VARCHAR(100) NOT NULL, — 密码,使用VARCHAR
nickname VARCHAR(50), — 昵称,使用VARCHAR
bio TEXT, — 个人简介,使用TEXT
avatar BLOB — 头像,使用BLOB
);
INSERT INTO fgedu_users (username, email, password, nickname, bio) VALUES
(‘fgedu01’, ‘fgedu01@fgedu.net.cn’, ‘password123’, ‘用户1’, ‘这是用户1的个人简介’),
(‘fgedu02’, ‘fgedu02@fgedu.net.cn’, ‘password456’, ‘用户2’, ‘这是用户2的个人简介’),
(‘fgedu03’, ‘fgedu03@fgedu.net.cn’, ‘password789’, ‘用户3’, ‘这是用户3的个人简介’);
SELECT user_id, username, email, nickname FROM fgedu_users;
+———+———-+———————-+———-+
| user_id | username | email | nickname |
+———+———-+———————-+———-+
| 1 | fgedu01 | fgedu01@fgedu.net.cn | 用户1 |
| 2 | fgedu02 | fgedu02@fgedu.net.cn | 用户2 |
| 3 | fgedu03 | fgedu03@fgedu.net.cn | 用户3 |
+———+———-+———————-+———-+
CREATE TABLE fgedu_users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL, — 用户名,使用VARCHAR
email VARCHAR(100) UNIQUE NOT NULL, — 邮箱,使用VARCHAR
password VARCHAR(100) NOT NULL, — 密码,使用VARCHAR
nickname VARCHAR(50), — 昵称,使用VARCHAR
bio TEXT, — 个人简介,使用TEXT
avatar BLOB — 头像,使用BLOB
);
INSERT INTO fgedu_users (username, email, password, nickname, bio) VALUES
(‘fgedu01’, ‘fgedu01@fgedu.net.cn’, ‘password123’, ‘用户1’, ‘这是用户1的个人简介’),
(‘fgedu02’, ‘fgedu02@fgedu.net.cn’, ‘password456’, ‘用户2’, ‘这是用户2的个人简介’),
(‘fgedu03’, ‘fgedu03@fgedu.net.cn’, ‘password789’, ‘用户3’, ‘这是用户3的个人简介’);
SELECT user_id, username, email, nickname FROM fgedu_users;
+———+———-+———————-+———-+
| user_id | username | email | nickname |
+———+———-+———————-+———-+
| 1 | fgedu01 | fgedu01@fgedu.net.cn | 用户1 |
| 2 | fgedu02 | fgedu02@fgedu.net.cn | 用户2 |
| 3 | fgedu03 | fgedu03@fgedu.net.cn | 用户3 |
+———+———-+———————-+———-+
4.3 日期时间类型实战
# 实战示例:日期时间类型应用
CREATE TABLE fgedu_orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_no VARCHAR(32) UNIQUE NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, — 创建时间,自动设置
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, — 更新时间,自动更新
shipped_at DATETIME, — 发货时间
delivered_at DATETIME — 送达时间
);
INSERT INTO fgedu_orders (user_id, order_no, amount, status) VALUES
(1, ‘20260407001’, 199.99, 1),
(2, ‘20260407002’, 299.99, 0),
(3, ‘20260407003’, 99.99, 2);
— 更新订单状态
UPDATE fgedu_orders SET status = 2, shipped_at = NOW() WHERE order_id = 2;
SELECT order_id, order_no, amount, status, created_at, updated_at, shipped_at FROM fgedu_orders;
+———-+————+——–+——–+———————+———————+———————+
| order_id | order_no | amount | status | created_at | updated_at | shipped_at |
+———-+————+——–+——–+———————+———————+———————+
| 1 | 20260407001 | 199.99 | 1 | 2026-04-07 19:00:00 | 2026-04-07 19:00:00 | NULL |
| 2 | 20260407002 | 299.99 | 2 | 2026-04-07 19:00:00 | 2026-04-07 19:05:00 | 2026-04-07 19:05:00 |
| 3 | 20260407003 | 99.99 | 2 | 2026-04-07 19:00:00 | 2026-04-07 19:00:00 | NULL |
+———-+————+——–+——–+———————+———————+———————+
CREATE TABLE fgedu_orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_no VARCHAR(32) UNIQUE NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, — 创建时间,自动设置
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, — 更新时间,自动更新
shipped_at DATETIME, — 发货时间
delivered_at DATETIME — 送达时间
);
INSERT INTO fgedu_orders (user_id, order_no, amount, status) VALUES
(1, ‘20260407001’, 199.99, 1),
(2, ‘20260407002’, 299.99, 0),
(3, ‘20260407003’, 99.99, 2);
— 更新订单状态
UPDATE fgedu_orders SET status = 2, shipped_at = NOW() WHERE order_id = 2;
SELECT order_id, order_no, amount, status, created_at, updated_at, shipped_at FROM fgedu_orders;
+———-+————+——–+——–+———————+———————+———————+
| order_id | order_no | amount | status | created_at | updated_at | shipped_at |
+———-+————+——–+——–+———————+———————+———————+
| 1 | 20260407001 | 199.99 | 1 | 2026-04-07 19:00:00 | 2026-04-07 19:00:00 | NULL |
| 2 | 20260407002 | 299.99 | 2 | 2026-04-07 19:00:00 | 2026-04-07 19:05:00 | 2026-04-07 19:05:00 |
| 3 | 20260407003 | 99.99 | 2 | 2026-04-07 19:00:00 | 2026-04-07 19:00:00 | NULL |
+———-+————+——–+——–+———————+———————+———————+
4.4 特殊类型实战
# 实战示例:特殊类型应用
CREATE TABLE fgedu_customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender ENUM(‘male’, ‘female’, ‘other’) NOT NULL, — 性别,使用ENUM
interests SET(‘sports’, ‘music’, ‘reading’, ‘travel’) NOT NULL, — 兴趣,使用SET
profile JSON, — 个人资料,使用JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO fgedu_customers (name, gender, interests, profile) VALUES
(‘张三’, ‘male’, ‘sports,music’, ‘{“age”: 25, “city”: “北京”, “phone”: “13800138000”}’),
(‘李四’, ‘female’, ‘reading,travel’, ‘{“age”: 30, “city”: “上海”, “phone”: “13900139000”}’),
(‘王五’, ‘male’, ‘sports,reading’, ‘{“age”: 35, “city”: “广州”, “phone”: “13700137000”}’);
SELECT customer_id, name, gender, interests, profile->>’$.city’ as city FROM fgedu_customers;
+————-+——+——–+—————-+——+
| customer_id | name | gender | interests | city |
+————-+——+——–+—————-+——+
| 1 | 张三 | male | sports,music | 北京 |
| 2 | 李四 | female | reading,travel | 上海 |
| 3 | 王五 | male | sports,reading | 广州 |
+————-+——+——–+—————-+——+
— 使用JSON函数查询
SELECT customer_id, name, JSON_EXTRACT(profile, ‘$.age’) as age FROM fgedu_customers WHERE JSON_EXTRACT(profile, ‘$.age’) > 28;
+————-+——+——+
| customer_id | name | age |
+————-+——+——+
| 2 | 李四 | 30 |
| 3 | 王五 | 35 |
+————-+——+——+
CREATE TABLE fgedu_customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender ENUM(‘male’, ‘female’, ‘other’) NOT NULL, — 性别,使用ENUM
interests SET(‘sports’, ‘music’, ‘reading’, ‘travel’) NOT NULL, — 兴趣,使用SET
profile JSON, — 个人资料,使用JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO fgedu_customers (name, gender, interests, profile) VALUES
(‘张三’, ‘male’, ‘sports,music’, ‘{“age”: 25, “city”: “北京”, “phone”: “13800138000”}’),
(‘李四’, ‘female’, ‘reading,travel’, ‘{“age”: 30, “city”: “上海”, “phone”: “13900139000”}’),
(‘王五’, ‘male’, ‘sports,reading’, ‘{“age”: 35, “city”: “广州”, “phone”: “13700137000”}’);
SELECT customer_id, name, gender, interests, profile->>’$.city’ as city FROM fgedu_customers;
+————-+——+——–+—————-+——+
| customer_id | name | gender | interests | city |
+————-+——+——–+—————-+——+
| 1 | 张三 | male | sports,music | 北京 |
| 2 | 李四 | female | reading,travel | 上海 |
| 3 | 王五 | male | sports,reading | 广州 |
+————-+——+——–+—————-+——+
— 使用JSON函数查询
SELECT customer_id, name, JSON_EXTRACT(profile, ‘$.age’) as age FROM fgedu_customers WHERE JSON_EXTRACT(profile, ‘$.age’) > 28;
+————-+——+——+
| customer_id | name | age |
+————-+——+——+
| 2 | 李四 | 30 |
| 3 | 王五 | 35 |
+————-+——+——+
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 常见问题与解决
- 数据类型过大:选择合适的类型,避免使用过大的类型
- 精度丢失:使用DECIMAL存储金额等需要精确计算的数据
- 字符串过长:根据实际需求选择合适的字符串类型
- 日期时间处理:注意时区问题,使用TIMESTAMP自动处理时区
- JSON查询性能:合理使用JSON索引,避免复杂的JSON查询
5.2 最佳实践
风哥提示:生产环境应根据业务需求和性能要求选择合适的数据类型,避免过度使用大类型,确保数据精度和查询性能。
5.3 选型检查清单
- 数值类型:根据范围和精度选择合适的类型
- 字符串类型:根据长度和使用场景选择CHAR或VARCHAR
- 日期时间类型:根据精度和时区需求选择合适的类型
- 特殊类型:根据业务需求选择ENUM、SET或JSON
- 存储空间:考虑数据量和存储成本
- 查询性能:考虑索引效率和查询速度
- 数据完整性:确保数据类型能够保证数据完整性
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
