当前位置: 首页 > article >正文

MySQL 数据类型全面指南:从理论到实践

在数据库设计和开发中,数据类型的选择是构建高效、可靠系统的基石。MySQL作为最流行的关系型数据库之一,提供了丰富的数据类型以满足各种数据存储需求。本文将全面介绍MySQL的数据类型体系,通过理论讲解和实际示例,帮助开发者做出明智的数据类型选择决策。

一、数值类型详解

1.1 整数类型

MySQL提供了五种整数类型,每种类型有不同的存储需求和数值范围:

CREATE TABLE integer_types (tiny_col TINYINT,           -- -128到127small_col SMALLINT,         -- -32,768到32,767medium_col MEDIUMINT,       -- -8,388,608到8,388,607int_col INT,                -- -2,147,483,648到2,147,483,647big_col BIGINT              -- -9,223,372,036,854,775,808到9,223,372,036,854,775,807
);

最佳实践建议

  • 根据数据范围选择最小够用的类型

  • 对于无符号数据,可使用UNSIGNED关键字扩大正数范围

  • 示例:存储年龄可使用TINYINT UNSIGNED

CREATE TABLE users (user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED
);

1.2 浮点数类型

MySQL支持近似值浮点数和精确小数:

CREATE TABLE float_types (float_col FLOAT(10,2),     -- 单精度浮点,10位总数,2位小数double_col DOUBLE(20,4),    -- 双精度浮点,20位总数,4位小数decimal_col DECIMAL(15,3)   -- 精确小数,15位总数,3位小数
);

金融计算警示
金融相关计算必须使用DECIMAL而非FLOAT/DOUBLE,以避免浮点精度问题:

-- 错误做法:使用浮点数存储金额
CREATE TABLE bad_account (account_id INT,balance FLOAT
);-- 正确做法:使用DECIMAL存储金额
CREATE TABLE good_account (account_id INT,balance DECIMAL(15,2)
);

二、字符串类型深度解析

2.1 文本字符串

MySQL提供多种文本存储选项:

CREATE TABLE text_types (char_col CHAR(10),          -- 固定长度10字符varchar_col VARCHAR(255),   -- 可变长度最多255字符tinytext_col TINYTEXT,      -- 最大255字符text_col TEXT,              -- 最大65,535字符mediumtext_col MEDIUMTEXT,  -- 最大16M字符longtext_col LONGTEXT       -- 最大4GB字符
);

CHAR vs VARCHAR实战比较

-- 存储效率比较
CREATE TABLE string_comparison (fixed_name CHAR(20),        -- 总是占用20字节variable_name VARCHAR(20)   -- 按实际长度占用
);-- 插入数据观察存储差异
INSERT INTO string_comparison VALUES 
('MySQL', 'MySQL'),            -- CHAR占用20字节,VARCHAR占用5+1字节
('PostgreSQL', 'PostgreSQL');  -- CHAR仍占用20字节,VARCHAR占用10+1字节

2.2 二进制数据

二进制类型适合存储非文本数据:

CREATE TABLE binary_types (binary_col BINARY(20),      -- 固定长度二进制varbinary_col VARBINARY(20),-- 可变长度二进制blob_col BLOB,              -- 二进制大对象image_col LONGBLOB          -- 适合存储图片等大型二进制
);

实际应用示例 - 存储用户头像:

CREATE TABLE user_profiles (user_id INT,avatar LONGBLOB,            -- 存储头像二进制数据mime_type VARCHAR(50)       -- 存储文件类型
);

三、日期和时间类型实战

MySQL日期时间类型丰富:

CREATE TABLE datetime_types (date_col DATE,                      -- 仅日期time_col TIME,                      -- 仅时间datetime_col DATETIME,              -- 日期和时间timestamp_col TIMESTAMP,            -- 自动更新的时间戳year_col YEAR                       -- 年份
);

日期函数应用示例

-- 创建订单表
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATETIME,delivery_date DATE
);-- 插入当前时间
INSERT INTO orders VALUES 
(1, NOW(), DATE_ADD(CURDATE(), INTERVAL 3 DAY));-- 查询今天下的订单
SELECT * FROM orders WHERE DATE(order_date) = CURDATE();-- 计算交付剩余天数
SELECT order_id, DATEDIFF(delivery_date, CURDATE()) AS days_remaining 
FROM orders;

四、特殊数据类型精讲

4.1 ENUM和SET类型

CREATE TABLE special_types (priority ENUM('Low', 'Medium', 'High'), -- 单选枚举tags SET('Sports', 'Politics', 'Tech', 'Entertainment') -- 多选集合
);-- 插入数据示例
INSERT INTO special_types VALUES 
('High', 'Sports,Tech'),        -- 选择两项
('Medium', 'Politics');         -- 选择一项

ENUM使用建议

  • 适合值固定且有限的场景

  • 比VARCHAR更节省空间

  • 但添加新值需要修改表结构

4.2 JSON类型(MySQL 5.7+)

CREATE TABLE json_example (id INT,profile JSON
);-- 插入JSON数据
INSERT INTO json_example VALUES 
(1, '{"name": "John", "age": 30, "hobbies": ["reading", "hiking"]}');-- 查询JSON字段
SELECT profile->"$.name" AS name FROM json_example;

JSON路径查询示例

-- 查找有阅读爱好的人
SELECT id FROM json_example 
WHERE JSON_CONTAINS(profile->'$.hobbies', '"reading"');

五、数据类型选择策略

5.1 选择原则

  1. 最小够用原则:选择能满足需求的最小类型

    • 存储年龄用TINYINT而非INT

    • 短字符串用VARCHAR而非TEXT

  2. 数据特性匹配

    • 精确计算用DECIMAL

    • 大文本用TEXT系列

    • 日期时间用专用类型而非字符串

  3. 未来扩展考虑

    • 预计会增长的字段留适当余量

    • 但不要过度预留

5.2 性能影响分析

存储引擎差异

  • InnoDB对VARCHAR和CHAR的处理不同

  • MyISAM对固定长度行有优化

索引效率

  • 较短字段索引效率更高

  • TEXT/BLOB类型需要前缀索引

-- 不好的设计
CREATE TABLE bad_design (id INT,long_description LONGTEXT,INDEX (long_description(100))  -- 只能使用前缀索引
);-- 改进设计
CREATE TABLE good_design (id INT,summary VARCHAR(200),         -- 可完整索引full_description LONGTEXT     -- 仅用于存储
);

六、实际案例研究

6.1 电商数据库设计示例

CREATE TABLE ecommerce (product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,sku CHAR(10) UNIQUE,                          -- 固定长度商品编码name VARCHAR(100),                            -- 商品名称description TEXT,                             -- 详细描述price DECIMAL(10,2) UNSIGNED,                 -- 价格stock SMALLINT UNSIGNED DEFAULT 0,            -- 库存weight FLOAT,                                 -- 重量is_active TINYINT(1) DEFAULT 1,               -- 是否上架created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,-- 创建时间updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-- 更新时间attributes JSON                               -- 动态属性
);

6.2 社交媒体数据库示例

CREATE TABLE social_media (post_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,user_id INT UNSIGNED,content TEXT,                                -- 帖子内容media_type ENUM('text', 'image', 'video'),    -- 内容类型location POINT,                               -- 地理位置tags SET('travel', 'food', 'fashion', 'tech'),-- 标签likes INT UNSIGNED DEFAULT 0,                 -- 点赞数created_at DATETIME,                          -- 创建时间INDEX (user_id),                              -- 用户索引FULLTEXT (content)                            -- 全文搜索
);

七、常见陷阱与解决方案

7.1 隐式类型转换问题

-- 问题示例:字符串与数字比较
SELECT * FROM products WHERE sku = 12345;  -- sku是CHAR类型-- 解决方案:保持类型一致
SELECT * FROM products WHERE sku = '12345';

7.2 日期格式混淆

-- 问题示例:依赖系统日期格式设置
INSERT INTO events VALUES ('2025-12-31');  -- 可能因系统设置失败-- 解决方案:使用标准格式或STR_TO_DATE
INSERT INTO events VALUES (STR_TO_DATE('31-12-2025', '%d-%m-%Y'));

7.3 VARCHAR长度陷阱

-- 问题示例:UTF-8字符占用多个字节
CREATE TABLE problem (name VARCHAR(255)  -- 实际可能只能存储85个中文字符
);-- 解决方案:考虑字符集影响
CREATE TABLE solution (name VARCHAR(255) CHARACTER SET utf8mb4
);

八、高级主题

8.1 空间数据类型

CREATE TABLE spatial_data (id INT PRIMARY KEY,location POINT,             -- 点path LINESTRING,            -- 线area POLYGON                -- 多边形
);-- 插入空间数据
INSERT INTO spatial_data VALUES 
(1, POINT(10, 20), LINESTRING(POINT(0,0), POLYGON(...));

8.2 自定义数据类型(MySQL 8.0+)

-- 创建基础类型
CREATE TYPE price AS DECIMAL(10,2) UNSIGNED;-- 使用自定义类型
CREATE TABLE products (id INT,cost price,sale_price price
);

结语

正确选择MySQL数据类型是数据库设计的关键环节,直接影响存储效率、查询性能和系统可靠性。通过本文的系统讲解和丰富示例,希望读者能够:

  1. 深入理解各种MySQL数据类型的特点

  2. 掌握实际应用中的最佳实践

  3. 避免常见的数据类型陷阱

  4. 设计出高效可靠的数据库结构

记住,良好的数据类型选择是数据库优化的第一步,也是构建高性能应用的基础。

相关文章:

MySQL 数据类型全面指南:从理论到实践

在数据库设计和开发中,数据类型的选择是构建高效、可靠系统的基石。MySQL作为最流行的关系型数据库之一,提供了丰富的数据类型以满足各种数据存储需求。本文将全面介绍MySQL的数据类型体系,通过理论讲解和实际示例,帮助开发者做出…...

第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化

第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化 🧠 一、PWM 占空比与亮度/音量控制原理 PWM(Pulse Width Modulation,脉宽调制)是一种常用的数字信号控制方式,广泛应用于 LED 灯光亮度、电…...

Quartus与Modelsim-Altera使用手册

目录 文章内容: 视频内容: Quartus: ModelSim: 顶层设计与子模块: 只是对所查阅的相关文章的总结与视频总结 文章内容: 这篇对基础操作很详细: 一、Quartus II软件的使用_quartus2软件上…...

uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)

在父组件中给子组件添加类名,子组件的样式由父组件决定 由于"微信小程序"存在【样式隔离机制】&#xff0c;且默认设置为isolated(启用样式隔离)&#xff0c;因此这里给出以下两种解决方案&#xff1a; // 小程序编译机制 1. 当 <style scoped> 存在时&#…...

【HCIA】BFD

前言 前面我们介绍了浮动路由以及出口路由器的默认路由配置&#xff0c;可如此配置会存在隐患&#xff0c;就是出口路由器直连的网络设备并不是运营商的路由器&#xff0c;而是交换机。此时我们就需要感知路由器的存活状态&#xff0c;这就需要用到 BFD&#xff08;Bidirectio…...

计算机视觉最不卷的方向:三维重建学习路线梳理

提到计算机视觉&#xff08;CV&#xff09;&#xff0c;大多数人脑海中会立马浮现出一个字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程师岗位数下降了16%&#xff0c;但求职人数增加了23%&#xff0c;求职人数与招聘岗位的比例达到了恐怖的15:1&#xff0…...

android抓包踩坑记录

​ 由于需要公司业务需求&#xff0c;需要抓取APP中摄像机插件的网络包&#xff0c;踩了两天坑&#xff0c;这里做个总结吧。 事先准备 android-studio emulatesdk 需要android模拟器和adb调试工具。如果已经有其他模拟器的话&#xff0c;可以只安装adb调试工具即可 mitmproxy…...

Webpack其他插件

安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…...

如何正确地写出单例模式

如何正确地写出单例模式 | Jarks Blog 枚举方式&#xff1a; public class SingletonObject {private SingletonObject() {}/*** 枚举类型是线程安全的&#xff0c;并且只会装载一次*/private enum Singleton {INSTANCE;private final SingletonObject instance;Singleton() {…...

常见相机焦段的分类及其应用

相机焦段是指镜头的焦距范围&#xff0c;决定了拍摄时的视角、画面范围和透视效果。不同焦段适合不同的拍摄场景和主题&#xff0c;以下是常见焦段的分类及其应用&#xff1a; 一、焦段的核心概念 焦距&#xff1a;镜头光学中心到成像传感器的距离&#xff08;单位&#xff1a…...

Python Matplotlib 库【绘图基础库】全面解析

让AI成为我们的得力助手&#xff1a;《用Cursor玩转AI辅助编程——不写代码也能做软件开发》 一、发展历程 Matplotlib 由 John D. Hunter 于 2003 年创建&#xff0c;灵感来源于 MATLAB 的绘图系统。作为 Python 生态中最早的可视化工具之一&#xff0c;它逐渐成为科学计算领…...

C++ string数据查找、string数据替换、string子串获取

string查找示例见下&#xff0c;代码见下&#xff0c;以及对应运行结果见下&#xff1a; #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…...

入侵检测SNORT系统部署过程记录

原理背景知识: 一、入侵检测系统介绍 1、入侵检测系统 入侵检测(Intrusion Detection) 指通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。 入侵检测系统(IDS) 是从网络和系统中收集…...

使用 Java 反射动态加载和操作类

Java 的反射机制(Reflection)是 Java 语言的一大特色,它允许程序在运行时检查、加载和操作类、方法、字段等元信息。通过 java.lang.Class 和 java.lang.reflect 包,开发者可以动态加载类、创建实例、调用方法,甚至在运行时构造新类。反射是 Java 灵活性的核心,广泛应用于…...

关于甲骨文(oracle cloud)丢失MFA的解决方案

前两年&#xff0c;申请了一个招商的多币种信用卡&#xff0c;然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间&#xff0c;人家要启用MFA验证。 啥叫MFA验证&#xff0c;类似与短信验证吧&#xff0c;就是绑定一个手机&#xff0c;然后下载一个app&#xff0c;每…...

vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册

简介 这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发&#xff0c;仅支持 Vue 3。 除了支持官方提供的各种语法模式外&#xff0c;还额外添加了日志输出展示模式&#xff0c;开箱即用&#xff0c;但不一定适用于所有场景。 如需完整文档和更多使用案例…...

C++ stl中的list的相关函数用法

文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用&#xff0c;首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...

【网络编程】七、详解HTTP 搭建HTTP服务器

文章目录 Ⅰ. HTTP协议的由来 -- 万维网Ⅱ. 认识URL1、URL的格式协议方案名登录信息 -- 忽略服务器地址服务器端口号文件路径查询字符串片段标识符 2、URL的编码和解码 Ⅲ. HTTP的报文结构1、请求协议格式2、响应协议格式&#x1f38f; 写代码的时候&#xff0c;怎么保证请求和…...

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下&#xff0c;为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持&#xff0c;无论是开发环境测试还是生产环境部署&#xff0…...

Spring Boot 中的重试机制

Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的&#xff0c;用于自动重试可能会失败的方法。在微服务架构和分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...

【React中useRef钩子详解】

一、useRef的核心特性 useRef是React提供的Hook,用于在函数组件中创建可变的持久化引用,具有以下核心特性: 持久化存储 返回的ref对象在组件整个生命周期内保持不变,即使组件重新渲染,current属性的值也不会丢失。无触发渲染 修改ref.current的值不会导致组件重新渲染,适…...

golang-ErrGroup用法以及源码解读笔记

介绍 ErrGroup可以并发执行多个goroutine&#xff0c;并可以很方便的处理错误 与sync.WaitGroup相比 错误处理 sync.WaitGroup只负责等待goroutine执行完成&#xff0c;而不处理返回值或者错误errgroup.Group目前虽然不能直接处理函数的返回值或错误。但是当goroutine返回错…...

17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki

在微服务中&#xff0c;日志是非常重要的组成部分。它不仅可以帮助我们排查问题&#xff0c;还可以帮助我们分析系统的性能和使用情况。 一、loki简介 loki是一个开源的日志聚合系统&#xff0c;它可以帮助我们高效地收集、存储和分析日志数据。loki的设计理念是“简单、快速…...

CVPR计算机视觉顶会论文解读:IPC-Dehaze 如何解决真实场景去雾难题

【CVPR 2025】迭代预测-评判编解码网络&#xff1a;突破真实场景去雾的极限 摘要 本文提出了一种名为IPC-Dehaze的创新去雾方法&#xff0c;通过迭代预测-评判框架和码本解码机制&#xff0c;有效解决了现有去雾算法在复杂场景下的性能瓶颈。该方法在多个基准测试中取得了SOT…...

ppy/osu构建 ipad作为osu按键xz笔记2 deepwiki websokect

ipad当x和z键玩osu #无声打osu#没磁轴怎么打osu 下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建&#xff1a;f5 运行&#xff1a;dotnet run --project osu.Desktop -c Debug deepwiki就是nb uinput是ubuntu的我现在没法调试&#xff0c;放着 import asyn…...

scons user 3.1.2

前言 感谢您抽出时间阅读有关 SCons 的内容。SCons 是一款下一代软件构建工具&#xff0c;或者称为 make 工具&#xff0c;即一种用于构建软件&#xff08;或其他文件&#xff09;并在底层输入文件发生更改时使已构建的软件保持最新状态的软件实用程序。 SCons 最显著的特点是…...

大语言模型主流架构解析:从 Transformer 到 GPT、BERT

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

.NET程序启动就报错,如何截获初期化时的问题json

一&#xff1a;背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候&#xff0c;程序一跑就报错&#xff0c;截图如下&#xff1a; 从给出的错误信息看大概是因为json格式无效导致的&#xff0c;在早期的训练营里曾经也有一例这样的报错&#xff0c;最后定位下来是公司…...

nacos:服务注册原理

目录 NaCos服务注册原理1、AbstractAutoServiceRegistration功能和作用onApplicationEvent()方法start()方法 2、NacosAutoServiceRegistration功能和作用NacosAutoServiceRegistration.register()方法AbstractAutoServiceRegistration.register()方法 3、NacosServiceRegistry…...

基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究

摘要&#xff1a;在数字文明时代&#xff0c;个人品牌塑造已从传统经验驱动转向数据智能驱动。本文以开源AI大模型、AI智能名片与S2B2C商城小程序源码为技术载体&#xff0c;提出"社会评价-数据验证-标签重构"的三维分析框架。通过实证研究发现&#xff0c;结合第三方…...