mysql进阶——数据类型一篇详解

本文将详细介绍MySQL各类数据类型的特点,包括介绍数值、字符串、日期时间、JSON 等类型的特点及注意事项

本文目录

    • 一、数值类型
      • [1. 整数类型](#1. 整数类型)
      • [2. 浮点与定点数](#2. 浮点与定点数)
    • 二、字符串类型
      • [1. 定长与变长](#1. 定长与变长)
      • [2. 二进制类型](#2. 二进制类型)
      • [3. TEXT 与 BLOB](#3. TEXT 与 BLOB)
      • [4. ENUM 与 SET](#4. ENUM 与 SET)
    • 三、日期与时间类型
      • [1. 类型对比](#1. 类型对比)
      • [2. 微秒支持](#2. 微秒支持)
    • [四、JSON 类型](#四、JSON 类型)

一、数值类型

1. 整数类型

整数类型有不同的字节长度和取值范围,如 TINYINT(1 字节,-128~127)、SMALLINT(2 字节)、INT(4 字节)、BIGINT(8 字节)。使用 UNSIGNED 关键字可使范围翻倍,例如 TINYINT UNSIGNED 的范围是 0~255。显示宽度(如 INT(5))仅影响显示格式,不影响存储。

sql 复制代码
CREATE TABLE products (
    product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    product_name VARCHAR(100) NOT NULL,
    stock SMALLINT UNSIGNED DEFAULT 0,    
    price DECIMAL(10, 2) NOT NULL         
);

2. 浮点与定点数

FLOAT(4 字节)和 DOUBLE(8 字节)是近似存储,可能丢失精度;DECIMAL(M,D) 是精确类型,适合财务数据,M 为总位数,D 为小数位数。

sql 复制代码
CREATE TABLE orders (
    order_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    total_amount DECIMAL(12, 2) NOT NULL, 
    user_id INT UNSIGNED NOT NULL
);

使用时要注意避免隐式类型转换导致索引失效

二、字符串类型

1. 定长与变长

CHAR(N) 是定长字符串,最多 255 字符,适合短且固定长度的数据;VARCHAR(N) 是变长字符串,最多 65535 字节,适合长度变化的数据。

sql 复制代码
CREATE TABLE product_details (
    product_id INT UNSIGNED PRIMARY KEY,
    title VARCHAR(255) NOT NULL,       
    description TEXT,                  
    sku_code CHAR(10)                  
);

2. 二进制类型

BINARY/VARBINARY 用于存储二进制数据,区分大小写。

3. TEXT 与 BLOB

TEXT 用于存储大文本,BLOB 用于存储二进制大对象。对它们创建索引时需指定前缀长度。

4. ENUM 与 SET

ENUM 是单选值,存储为整数索引,插入非法值会报错或存为 ''SET 是多选值,用位掩码存储,查询需用 FIND_IN_SET()

sql 复制代码
CREATE TABLE orders (
    order_id BIGINT UNSIGNED PRIMARY KEY,
    status ENUM('pending', 'paid', 'shipped', 'completed') NOT NULL
);

三、日期与时间类型

1. 类型对比

DATE 存储日期(YYYY-MM-DD),TIME 存储时间(HH:MM:SS),DATETIME 存储日期 + 时间(YYYY-MM-DD HH:MM:SS),范围大且无时区转换,TIMESTAMP 存储时间戳(范围 1970 - 2038 年),自动转换为 UTC 存储,支持自动更新。

sql 复制代码
CREATE TABLE orders (
    order_id BIGINT UNSIGNED PRIMARY KEY,
    created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6), 
    paid_at TIMESTAMP NULL 
);

2. 微秒支持

MySQL 5.6.4+ 支持微秒,如 DATETIME(6)

四、JSON 类型

JSON 类型可存储有效 JSON 文档,支持路径查询和部分更新。

sql 复制代码
CREATE TABLE products (
    product_id INT UNSIGNED PRIMARY KEY,
    attributes JSON NOT NULL 
);

INSERT INTO products VALUES (1, '{
    "color": ["red", "blue"],
    "size": {"S": 10, "M": 5},
    "specs": {"weight": "1.2kg", "material": "metal"}
}');

-- 查询红色商品
SELECT product_id 
FROM products 
WHERE JSON_CONTAINS(attributes->'$.color', '"red"');

|-----------------------------------------------------------------------------------------------------|--------------------|--------------------------------------------------------------------------------------------------|
| ← 上一篇 Java进阶------常用类及常用方法详解 | 记得点赞、关注、收藏哦! | 下一篇 Java进阶------数组超详细整理 → |

相关推荐
PSLoverS8 分钟前
c++如何读取和修改可执行文件的PE头信息_IMAGE_NT_HEADERS解析【进阶】
jvm·数据库·python
阿丰资源13 分钟前
基于SpringBoot的房产销售系统设计与实现(附源码+数据库+文档,一键运行)
数据库·spring boot·后端
gmaajt16 分钟前
React Native 单元测试中第三方依赖的正确 Mock 策略
jvm·数据库·python
a95114164220 分钟前
宝塔面板数据库查询响应慢_利用慢查询日志进行优化
jvm·数据库·python
l1t35 分钟前
DeepSeek总结的面向 PostgreSQL 分析和 HTAP 工作负载的两种高性能表访问方法
数据库·postgresql
九皇叔叔36 分钟前
MySQL 8.x 隔离级别调整
数据库·mysql·事务·隔离级别
许愿OvO38 分钟前
Redis 7.4.8高可用集群实战:主从复制+哨兵+Cluster全解析
数据库·redis·bootstrap
2401_8314194438 分钟前
如何用 http 模块创建一个基础的 Web 服务器处理请求
jvm·数据库·python
pele39 分钟前
Redis如何防止AOF文件无限增大_触发BGREWRITEAOF命令进行日志重写
jvm·数据库·python
qq_4142565739 分钟前
golang如何设计HTTP中间件链_golang HTTP中间件链设计方法
jvm·数据库·python