MySQL 数据类型全面指南:详细说明与关键注意事项

MySQL 数据类型全面指南:详细说明与关键注意事项

MySQL 提供了丰富的数据类型,合理选择对数据库性能、存储效率和数据准确性至关重要。以下是所有数据类型的详细说明及使用注意事项:


一、数值类型

整数类型
类型字节有符号范围无符号范围说明
TINYINT1-128 ~ 1270 ~ 255小整数(如状态值)
SMALLINT2-32,768 ~ 32,7670 ~ 65,535较小整数
MEDIUMINT3-8M ~ 8M-10 ~ 16M-1中等整数
INT4-2.1B ~ 2.1B-10 ~ 4.2B-1标准整数(最常用)
BIGINT8-9.2E18 ~ 9.2E18-10 ~ 1.8E19-1大整数(如主键ID)

注意事项

  1. 优先选择能满足需求的最小类型(TINYINT > SMALLINT > INT > BIGINT
  2. 无符号整数用 UNSIGNED 关键字:INT UNSIGNED
  3. ZEROFILL 自动添加 UNSIGNED 并用0填充:INT(5) ZEROFILL
  4. 显示宽度(如INT(11))仅影响显示,不影响存储大小
浮点数类型
类型字节说明
FLOAT4单精度浮点数,约7位精度
DOUBLE8双精度浮点数,约15位精度
DECIMAL变长精确小数(财务计算首选)

语法

DECIMAL(M, D)  -- M=总位数(1-65), D=小数位数(0-30)

注意事项

  1. FLOAT/DOUBLE 有精度损失风险,财务计算必须用 DECIMAL
    -- 错误示例
    FLOAT: 0.1 + 0.2 = 0.30000001192092896-- 正确方案
    DECIMAL(10,2): 0.1 + 0.2 = 0.30
    
  2. DECIMAL(5,2) 范围:-999.99 ~ 999.99
  3. 存储空间计算:CEILING(M/9)*4 字节(如 DECIMAL(20,6) 占9字节)

二、日期时间类型

类型格式范围字节说明
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’‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’5-8日期+时间(推荐使用
TIMESTAMP‘YYYY-MM-DD HH:MM:SS’‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ UTC4时间戳(自动转换时区)
YEARYYYY1901 ~ 21551年份值

注意事项

  1. TIMESTAMP2038年问题:最大到 2038-01-19,新系统建议用 DATETIME
  2. 时区处理:
    • TIMESTAMP 存 UTC 时间,检索时转当前时区
    • DATETIME 按字面值存储,不转换时区
  3. 默认值和自动更新:
    -- 自动设置创建时间
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,-- 自动更新修改时间
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
  4. 存储空间优化:
    • 只需要日期用 DATE (3字节)
    • 只需要时间用 TIME (3字节)

三、字符串类型

定长字符串
类型最大长度特点
CHAR(n)255字符固定长度,空格填充,检索快

适用场景:固定长度数据(MD5、国家代码、邮编)

变长字符串
类型最大长度特点
VARCHAR(n)65,535字节按需存储,节省空间

注意事项

  1. n 表示字符数而非字节数(UTF8MB4 中 1字符=4字节)
  2. 实际存储空间 = 字符数 × 字符集字节 + 长度前缀(1-2字节)
  3. 最大长度限制:
    -- UTF8MB4下实际最大字符数
    65,535 / 416,383 字符
    
文本类型
类型最大长度特点
TINYTEXT255字节短文本
TEXT64KB (65,535字节)标准文本(文章内容)
MEDIUMTEXT16MB较大文本(书籍章节)
LONGTEXT4GB超大文本(整个文档)

注意事项

  1. VARCHAR 区别:
    • TEXT 类型不能有默认值
    • 排序使用磁盘临时表,VARCHAR 优先用内存
  2. 使用建议:
    • < 255字符:VARCHAR
    • 255字符~64KB:TEXT
    • 64KB:MEDIUMTEXT/LONGTEXT


四、二进制数据类型

二进制字符串
类型说明
BINARY(n)定长二进制(最大255字节)
VARBINARY(n)变长二进制(最大65,535字节)

适用场景:加密数据、哈希值

二进制大对象(BLOB)
类型最大长度说明
TINYBLOB255字节小二进制对象
BLOB64KB标准二进制对象
MEDIUMBLOB16MB中等二进制对象
LONGBLOB4GB超大二进制对象

注意事项

  1. TEXT 类型区别:
    • BLOB 存储二进制数据(如图片、PDF)
    • TEXT 存储字符数据
  2. 性能影响:大 BLOB 会显著增加 I/O 负载

五、枚举与集合类型

枚举类型 (ENUM)
gender ENUM('Male', 'Female', 'Other')
  • 特点:单选值,内部存储为整数(1-2字节)
  • 注意事项
    • 避免超过 65,535 个选项
    • 插入非列表值会报错(严格模式)或存空字符串
集合类型 (SET)
permissions SET('Read', 'Write', 'Delete', 'Admin')
  • 特点:多选值,按位存储(1-8字节)
  • 注意事项
    • 最大64个选项
    • 查询用 FIND_IN_SET()WHERE FIND_IN_SET('Write', permissions)

六、JSON 类型 (MySQL 5.7+)

user_profile JSON

操作示例

-- 插入
INSERT INTO users VALUES ('{"name": "John", "age": 30}');-- 查询
SELECT user_profile->>"$.name" FROM users;-- 更新
UPDATE users SET user_profile = JSON_SET(user_profile, '$.age', 31);

注意事项

  1. 优势:
    • 自动验证JSON格式
    • 高效读取(无需解析整个文档)
  2. 限制:
    • 最大大小同 LONGTEXT (4GB)
    • 不支持直接索引(需生成列+索引)

数据类型选择最佳实践

  1. 精确数值计算
    ✅ 用 DECIMAL
    ❌ 避免 FLOAT/DOUBLE

  2. 时间存储
    ✅ 用 DATETIME(无2038限制)
    ❌ 避免 TIMESTAMP 长期存储

  3. 字符串优化
    ✅ 定长用 CHAR(如 UUID、MD5)
    ✅ 变长用 VARCHAR(<255字符)
    ✅ 大文本用 TEXT

  4. 存储空间敏感场景

    • 小整数:TINYINT UNSIGNED(1字节)
    • 状态值:ENUM(1-2字节)
    • 日期:DATE(3字节)
  5. 性能关键点

    • CHAR vs VARCHAR:定长字段 CHAR 检索更快
    • TEXT/BLOB:避免 SELECT *,单独存储大字段
    • 整型索引比字符型快

常见错误案例

错误1:用 VARCHAR 存数字

-- 错误:数字比较需隐式转换
SELECT * FROM products WHERE product_id = 100; -- 优化:改为 INT
ALTER TABLE products MODIFY product_id INT;

错误2:日期范围查询

-- 错误:字符串比较低效
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';-- 优化:用日期函数
SELECT * FROM orders 
WHERE order_date >= '2023-01-01' AND order_date < '2023-02-01';

错误3:ENUM 滥用

-- 错误:选项过多
color ENUM('red','green','blue', ... 100+ colors);-- 优化:改用关联表
CREATE TABLE colors (id TINYINT, name VARCHAR(20));

合理选择数据类型是数据库优化的基础,需结合业务需求、存储成本和性能要求综合决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912291.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode437-路径总和III

leetcode 437 思路 利用前缀和hash map解答 前缀和在这里的含义是&#xff1a;从根节点到当前节点的路径上所有节点值的总和 我们使用一个 Map 数据结构来记录这些前缀和及其出现的次数 具体思路如下&#xff1a; 初始化&#xff1a;创建一个 Map &#xff0c;并将前缀和 …

UI前端与数字孪生融合探索新领域:智慧家居的可视化设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;智慧家居的数字化转型浪潮 在物联网与人工智能技术的推动下&#xff0c…

数据结构知识点总结--绪论

1.1 数据结构的基本概念 1.1.1 基本概念和术语 主要涉及概念有&#xff1a; 数据、数据元素、数据对象、数据类型、数据结构 #mermaid-svg-uyyvX6J6ofC9rFSB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uyyvX6…

pip install mathutils 安装 Blender 的 mathutils 模块时,编译失败了

你遇到的问题是因为你试图通过 pip install mathutils 安装 Blender 的 mathutils 模块时&#xff0c;编译失败了&#xff0c;主要原因是&#xff1a; 2018年 的老版本也不行 pip install mathutils2.79 ❌ 报错核心总结&#xff1a; 缺失头文件 BLI_path_util.h&#xff1a;…

编译安装交叉工具链 riscv-gnu-toolchain

参考链接&#xff1a; https://zhuanlan.zhihu.com/p/258394849 1&#xff0c;下载源码 git clone https://gitee.com/mirrors/riscv-gnu-toolchain 2&#xff0c;进入目录 cd riscv-gnu-toolchain 3&#xff0c;去掉qemu git rm qemu 4&#xff0c;初始化 git submodule…

复制 生成二维码

一、安装插件 1、复制 npm install -g copy-to-clipboard import copy from copy-to-clipboard; 2、生成二维码 & 下载 npm install -g qrcode import QRCode from qrcode.react; 二、功能&#xff1a;生成二维码 & 下载 效果图 1、常规使用&#xff08;下载图片模糊…

自由职业的经营视角

“领导力的核心是帮助他人看到自己看不到的东西。” — 彼得圣吉 最近与一些自由职业者的交流中&#xff0c;发现很多专业人士都会从专业视角来做交流&#xff0c;这也让我更加理解我们海外战略顾问庄老师在每月辅导时的提醒——经营者视角和专业人士视角的不同。这不仅让大家获…

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…

告别固定密钥!在单一账户下用 Cognito 实现 AWS CLI 的 MFA 单点登录

大家好&#xff0c;很多朋友&#xff0c;特别是通过合作伙伴或服务商使用 AWS 的同学&#xff0c;可能会发现自己的 IAM Identity Center 功能受限&#xff0c;无法像在组织管理账户里那样轻松配置 CLI 的 SSO (aws configure sso)。那么&#xff0c;我们就要放弃治疗&#xff…

未来机器视觉软件将更注重成本控制,边缘性能,鲁棒性、多平台支持、模块优化与性能提升,最新版本opencv-4.11.0更新了什么

OpenCV 4.11.0 作为 4.10.0 的后续版本,虽然没有在提供的搜索结果中直接列出详细更新内容,但结合 OpenCV 4.10.0 的重大改进方向(发布于 2024 年 6 月),可以合理推断 4.11.0 版本可能延续了对多平台支持、模块优化和性能提升的强化。以下是基于 OpenCV 近期更新模式的推测…

小程序入门:数据请求全解析

在微信小程序开发中&#xff0c;数据请求是实现丰富功能的关键环节。本文将带你深入了解小程序数据请求的相关知识&#xff0c;包括请求限制、配置方法以及不同请求方式的实现&#xff0c;还会介绍如何在页面加载时自动请求数据&#xff0c;同时附上详细代码示例&#xff0c;让…

开源版gpt4o 多模态MiniGPT-4 实现原理详解

MiniGPT-4是开源的GPT-4的平民版。本文用带你快速掌握多模态大模型MiniGPT-4的模型架构、训练秘诀、实战亮点与改进方向。 1 模型架构全景&#xff1a;三层协同 &#x1f4ca; 模型底部实际输入图像&#xff0c;经 ViT Q-Former 编码。蓝色方块 (视觉编码器)&#xff1a;左侧…

Flutter基础(控制器)

第1步&#xff1a;找个遥控器&#xff08;创建控制器&#xff09;​ // 就像买新遥控器要装电池 TextEditingController myController TextEditingController(); ​​第2步&#xff1a;连上你的玩具&#xff08;绑定到组件&#xff09;​​ TextField(controller: myContro…

Spring Boot使用Redis常用场景

Spring Boot使用Redis常用场景 一、概述&#xff1a;Redis 是什么&#xff1f;为什么要用它&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个内存中的数据存储系统&#xff08;类似一个“超级大字典”&#xff09;&#xff0c;它能存各种类型的数据…

CAD文件处理控件Aspose.CAD教程:在 C# 中将 DXF 文件转换为 SVG - AutoCAD C# 示例

概述 使用 C# 轻松将DXF文件转换为SVG。此转换可更好地兼容 Web 应用程序&#xff0c;并增强 CAD 图纸的视觉呈现效果。使用Aspose.CAD for .NET &#xff0c;开发人员可以轻松实现此转换过程。该 SDK 提供强大的功能&#xff0c;使其成为 C# 开发人员的可靠选择。Aspose.CAD …

Gitee 持续集成与交付(CI/CD)篇

Gitee 持续集成与交付&#xff08;CI/CD&#xff09;篇 &#x1f680; 文章目录 Gitee 持续集成与交付&#xff08;CI/CD&#xff09;篇 &#x1f680;&#x1f3af; 什么是 CI/CD&#xff1f;&#x1f31f; Gitee Go 介绍✨ 核心特性&#x1f3a8; 支持的技术栈 &#x1f680;…

深度学习:PyTorch卷积神经网络图像分类案例分享

本文目录&#xff1a; 一、了解CIFAR-10数据集二、案例之导包三、案例之创建数据集四、案例之搭建神经网络&#xff08;模型构建&#xff09;五、案例之编写训练函数&#xff08;训练模型&#xff09;六、案例之编写预测函数&#xff08;模型测试&#xff09; 前言&#xff1a;…

记录多功能按键第二种写法使用定时器周期间隔判断.

逻辑是通过定时器溢出周期进行判断按下次数 比如设置定时器溢出周期为500MS,每次溢出都会判断按键按下次数,如果下个周期前没有触发按下,则结束键值判断.并确定触发键值.清空按下次数标志.测试比一个定时器周期按下按键次数判断写法要稳定... 记录STM32实现多功能按键_stm32一…

【安卓Sensor框架-1】SensorService 的启动流程

内核启动后&#xff0c;首个用户空间进程init&#xff08;pid1&#xff09;解析init.rc配置文件&#xff0c;启动关键服务&#xff08;如Zygote和ServiceManager&#xff09;。 Zygote服务配置为/system/bin/app_process --zygote --start-system-server&#xff0c;后续用于孵…

centos网卡绑定参考

同事整理分享&#xff1a; 1. 加载 Bonding 模块 modprobe bonding 获取网卡名称 ip a 找到接了网线的网卡名称&#xff0c;记下。 3. 配置物理网卡 创建并编辑 /etc/sysconfig/network-scripts/ifcfg-ens36&#xff08;ifcfg-后面的内容根据上面找到的具体网卡名称决定&#…