MySQL 数据类型概览

🎉摘要:本文全面解析MySQL支持的数值、字符串、日期时间等核心数据类型,包括TINYINT、INT、VARCHAR、TEXT、DATETIME、TIMESTAMP等,并附有详细的电商数据库(用户、商品、订单表)创建实例,帮助您根据实际业务场景选择合适的数据类型以优化性能和存储空间。

MySQL 支持多种数据类型,选择合适的类型对性能和存储空间都很重要。这里先做个概览,后续章节会进行详细讲解。下面将根据不同的类型对类型进行分类整理:

数值类型

用来存储数字,如整数、浮点数等的数据类型,如下表:

类型存储空间有符号范围无符号范围
TINYINT1字节-128 ~ 1270 ~ 255
SMALLINT2字节-32768 ~ 327670 ~ 65535
MEDIUMINT3字节-8388608 ~ 83886070 ~ 16777215
INT/INTEGER4字节-21亿 ~ 21亿0 ~ 43亿
BIGINT8字节极大范围极大范围
FLOAT4字节单精度浮点数-
DOUBLE8字节双精度浮点数-
DECIMAL变长定点数,精度准确-

字符串类型

用来存储字符串的类型,如存储字符、存储长文本等等,如下表:

类型最大长度特点
CHAR(n)255字符定长,不够补空格,查询快
VARCHAR(n)65535字节变长,节省空间,查询稍慢
TINYTEXT255字节小文本
TEXT65535字节普通文本
MEDIUMTEXT16MB中等文本
LONGTEXT4GB大文本
BLOB65535字节二进制数据

日期时间类型

用来存储日期和时间的类型,如下表:

类型格式范围特性
DATEYYYY-MM-DD1000-01-01 ~ 9999-12-31日期
TIMEHH:MM:SS-838:59:59 ~ 838:59:59时间
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 ~ 9999-12-31日期时间
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 ~ 2038-01-19带时区,自动更新
YEARYYYY1901 ~ 2155年份

其他类型

除了上面常见的三大类型外,还支持其他一些数据类型:

  • ENUM:枚举类型,只能从预定义值中选择

  • SET:集合类型,可以选择多个预定义值

  • JSON:MySQL 5.7.8+ 支持的JSON数据类型

  • BOOLEAN:MySQL中的布尔类型实际是 TINYINT(1) 的别名

示例:创建完整的电商数据库

为了更好地理解数据类型,我们来创建一个简化版的电商数据库,包含用户、商品、订单等表。例如:

(1)创建数据库

mysql> CREATE DATABASE IF NOT EXISTS ecommerce
    ->     CHARACTER SET utf8mb4
    ->     COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

(2)切换到 ecommerce 数据库

mysql> USE ecommerce;
Database changed

(3)创建用户表

mysql> CREATE TABLE users (
    ->     user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    ->     username VARCHAR(50) NOT NULL COMMENT '用户名',
    ->     password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希',
    ->     email VARCHAR(100) NOT NULL COMMENT '邮箱',
    ->     phone VARCHAR(20) COMMENT '手机号',
    ->     real_name VARCHAR(50) COMMENT '真实姓名',
    ->     gender TINYINT(1) DEFAULT 0 COMMENT '性别:0保密,1男,2女',
    ->     birthday DATE COMMENT '生日',
    ->     status TINYINT(1) DEFAULT 1 COMMENT '状态:1正常,0禁用',
    ->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
    ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    ->     UNIQUE KEY uk_username (username),
    ->     UNIQUE KEY uk_email (email)
    -> ) ENGINE=InnoDB COMMENT='用户表';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

(4)创建商品分类表

mysql> CREATE TABLE categories (
    ->     category_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '分类ID',
    ->     parent_id INT DEFAULT 0 COMMENT '父分类ID,0为顶级分类',
    ->     category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
    ->     sort_order INT DEFAULT 0 COMMENT '排序序号',
    ->     is_show TINYINT(1) DEFAULT 1 COMMENT '是否显示',
    ->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->     INDEX idx_parent (parent_id)
    -> ) ENGINE=InnoDB COMMENT='商品分类表';
Query OK, 0 rows affected, 1 warning (0.01 sec)

(5)创建商品表

mysql> CREATE TABLE products (
    ->     product_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID',
    ->     product_code VARCHAR(50) NOT NULL COMMENT '商品编码',
    ->     product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
    ->     category_id INT NOT NULL COMMENT '分类ID',
    ->     price DECIMAL(10, 2) NOT NULL COMMENT '售价',
    ->     market_price DECIMAL(10, 2) COMMENT '市场价',
    ->     cost_price DECIMAL(10, 2) COMMENT '成本价',
    ->     stock INT DEFAULT 0 COMMENT '库存',
    ->     unit VARCHAR(20) COMMENT '单位',
    ->     main_image VARCHAR(500) COMMENT '主图URL',
    ->     description TEXT COMMENT '商品描述',
    ->     detail LONGTEXT COMMENT '商品详情(HTML)',
    ->     is_on_sale TINYINT(1) DEFAULT 1 COMMENT '是否上架',
    ->     is_hot TINYINT(1) DEFAULT 0 COMMENT '是否热销',
    ->     is_new TINYINT(1) DEFAULT 0 COMMENT '是否新品',
    ->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->     UNIQUE KEY uk_code (product_code),
    ->     INDEX idx_category (category_id),
    ->     INDEX idx_price (price),
    ->     INDEX idx_status (is_on_sale)
    -> ) ENGINE=InnoDB COMMENT='商品表';
Query OK, 0 rows affected, 3 warnings (0.01 sec)

(6)创建订单表

mysql> CREATE TABLE orders (
    ->     order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
    ->     order_no VARCHAR(32) NOT NULL COMMENT '订单编号',
    ->     user_id INT NOT NULL COMMENT '用户ID',
    ->     total_amount DECIMAL(12, 2) NOT NULL COMMENT '订单总金额',
    ->     discount_amount DECIMAL(12, 2) DEFAULT 0 COMMENT '优惠金额',
    ->     freight_amount DECIMAL(10, 2) DEFAULT 0 COMMENT '运费',
    ->     pay_amount DECIMAL(12, 2) NOT NULL COMMENT '应付金额',
    ->     status TINYINT(1) DEFAULT 0 COMMENT '订单状态:0待付款,1待发货,2待收货,3已完成,4已取消',
    ->     pay_time TIMESTAMP NULL COMMENT '支付时间',
    ->     ship_time TIMESTAMP NULL COMMENT '发货时间',
    ->     receive_time TIMESTAMP NULL COMMENT '收货时间',
    ->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->     UNIQUE KEY uk_order_no (order_no),
    ->     INDEX idx_user (user_id),
    ->     INDEX idx_status (status),
    ->     INDEX idx_created (created_at)
    -> ) ENGINE=InnoDB COMMENT='订单表';
Query OK, 0 rows affected, 1 warning (0.01 sec)

(7)创建订单商品明细表

mysql> CREATE TABLE order_items (
    ->     item_id INT AUTO_INCREMENT PRIMARY KEY,
    ->     order_id INT NOT NULL COMMENT '订单ID',
    ->     product_id INT NOT NULL COMMENT '商品ID',
    ->     product_name VARCHAR(200) NOT NULL COMMENT '商品名称(快照)',
    ->     product_image VARCHAR(500) COMMENT '商品图片(快照)',
    ->     price DECIMAL(10, 2) NOT NULL COMMENT '成交单价',
    ->     quantity INT NOT NULL COMMENT '数量',
    ->     subtotal DECIMAL(12, 2) NOT NULL COMMENT '小计金额',
    ->     INDEX idx_order (order_id)
    -> ) ENGINE=InnoDB COMMENT='订单商品明细表';
Query OK, 0 rows affected (0.01 sec)

上述这个数据库的设计遵循了一些基本原则:

  1. 命名规范:表名使用复数形式,字段名使用蛇形命名法

  2. 主键设计:统一使用自增ID作为主键,业务相关的唯一性约束用唯一索引实现

  3. 注释完善:每个字段和表都添加了中文注释

  4. 冗余设计:订单表中存储了商品名称和图片的快照,防止商品修改后订单历史数据丢失

  5. 索引优化:在常用的查询条件字段上创建了索引

更多知识请阅读后续章节……谢谢!!!

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号