MySQL数据类型

学习MySQL支持的各种数据类型及其用法

MySQL数据类型概述

MySQL支持多种数据类型,主要包括数值类型、日期和时间类型、字符串类型等。正确选择数据类型对数据库性能和存储效率至关重要。

数值类型

数值类型用于存储数字数据,包括整数类型和浮点数类型。

整数类型

类型 字节 有符号范围 无符号范围 描述
TINYINT 1 -128 到 127 0 到 255 非常小的整数
SMALLINT 2 -32,768 到 32,767 0 到 65,535 小整数
MEDIUMINT 3 -8,388,608 到 8,388,607 0 到 16,777,215 中等整数
INT/INTEGER 4 -2,147,483,648 到 2,147,483,647 0 到 4,294,967,295 标准整数
BIGINT 8 -2^63 到 2^63-1 0 到 2^64-1 大整数
整数类型使用示例
CREATE TABLE integer_example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    age TINYINT UNSIGNED,
    score SMALLINT,
    population INT UNSIGNED,
    big_number BIGINT
);

浮点数类型

类型 字节 描述 精度
FLOAT 4 单精度浮点数 约7位小数
DOUBLE 8 双精度浮点数 约15位小数
DECIMAL(M,D) 变长 精确小数 M位总数,D位小数
浮点数类型使用示例
CREATE TABLE float_example (
    id INT,
    price DECIMAL(10, 2),    -- 总10位,2位小数
    percentage FLOAT,
    scientific_value DOUBLE
);
注意:对于需要精确计算的金额等数据,应使用DECIMAL类型而不是FLOAT或DOUBLE,以避免浮点数精度问题。

日期和时间类型

MySQL提供了多种日期和时间类型来存储时间数据。

类型 格式 范围 描述
DATE YYYY-MM-DD 1000-01-01 到 9999-12-31 日期值
TIME HH:MM:SS -838:59:59 到 838:59:59 时间值
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 到 9999-12-31 23:59:59 日期和时间值
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 到 2038-01-19 03:14:07 时间戳,自动更新
YEAR YYYY 1901 到 2155 年份值
日期时间类型使用示例
CREATE TABLE datetime_example (
    id INT,
    birth_date DATE,
    meeting_time TIME,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    birth_year YEAR
);

字符串类型

字符串类型用于存储文本数据,包括定长和变长字符串。

文本字符串类型

类型 最大长度 描述 存储特点
CHAR(n) 255字符 定长字符串 固定长度,不足补空格
VARCHAR(n) 65,535字符 变长字符串 按实际长度存储
TINYTEXT 255字符 短文本字符串 变长存储
TEXT 65,535字符 文本字符串 变长存储
MEDIUMTEXT 16,777,215字符 中等长度文本 变长存储
LONGTEXT 4,294,967,295字符 长文本 变长存储
字符串类型使用示例
CREATE TABLE string_example (
    id INT,
    country_code CHAR(2),        -- 固定2字符,如'CN'
    username VARCHAR(50),       -- 最多50字符
    email VARCHAR(100),
    description TEXT,           -- 长文本描述
    long_content LONGTEXT      -- 超长文本内容
);
选择建议:对于固定长度的数据(如国家代码、性别代码)使用CHAR,对于变长数据使用VARCHAR,对于大段文本使用TEXT类型。

二进制字符串类型

类型 最大长度 描述
BINARY(n) 255字节 定长二进制字符串
VARBINARY(n) 65,535字节 变长二进制字符串
TINYBLOB 255字节 短二进制大对象
BLOB 65,535字节 二进制大对象
MEDIUMBLOB 16,777,215字节 中等二进制大对象
LONGBLOB 4,294,967,295字节 长二进制大对象

其他类型

枚举类型(ENUM)

ENUM类型用于存储预定义的值列表中的一个值。

ENUM类型使用示例
CREATE TABLE enum_example (
    id INT,
    status ENUM('active', 'inactive', 'pending'),
    priority ENUM('low', 'medium', 'high')
);

集合类型(SET)

SET类型用于存储预定义的值列表中的零个或多个值。

SET类型使用示例
CREATE TABLE set_example (
    id INT,
    tags SET('red', 'green', 'blue', 'yellow')
);

-- 插入数据示例
INSERT INTO set_example (id, tags) VALUES (1, 'red,green');

JSON数据类型

MySQL 5.7.8+版本开始支持JSON数据类型,用于存储JSON格式的数据。

JSON类型使用示例
CREATE TABLE json_example (
    id INT,
    user_data JSON,
    preferences JSON
);

-- 插入JSON数据
INSERT INTO json_example (id, user_data) 
VALUES (1, '{"name": "John", "age": 30, "hobbies": ["reading", "swimming"]}');

空间数据类型

MySQL支持空间数据类型,用于存储地理空间数据。

  • GEOMETRY - 所有空间类型的基类
  • POINT - 点
  • LINESTRING - 线
  • POLYGON - 多边形
  • MULTIPOINT - 多点
  • MULTILINESTRING - 多线
  • MULTIPOLYGON - 多多边形
  • GEOMETRYCOLLECTION - 几何集合

数据类型选择原则

  • 最小原则 - 选择能满足需求的最小数据类型
  • 简单原则 - 选择简单的数据类型,如整数比字符串处理更快
  • 避免NULL - 尽量使用NOT NULL约束,可以提高查询性能
  • 字符集选择 - 使用utf8mb4字符集以支持所有Unicode字符

数据类型对性能的影响

数据类型的选择直接影响数据库性能:

  • 存储空间 - 选择合适的数据类型可以减少存储空间
  • 索引效率 - 较小的数据类型索引效率更高
  • 查询性能 - 简单的数据类型处理更快
  • 内存使用 - 合理的数据类型可以减少内存使用

数据类型转换

MySQL支持隐式和显式数据类型转换:

数据类型转换示例
-- 隐式转换
SELECT '123' + 456;  -- 结果为579

-- 显式转换
SELECT CAST('123' AS UNSIGNED);
SELECT CONVERT('2023-01-01', DATE);

数据类型与字符集

MySQL支持多种字符集,影响字符串类型的存储和比较:

  • utf8 - 支持大多数Unicode字符(3字节)
  • utf8mb4 - 支持所有Unicode字符(4字节)
  • latin1 - 西欧字符集
  • gbk - 简体中文字符集
字符集设置示例
-- 创建表时指定字符集
CREATE TABLE charset_example (
    id INT,
    name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意:错误的数据类型选择会导致存储空间浪费、性能下降和数据不一致等问题。

数据类型最佳实践

  • 为标识符使用整数类型
  • 为金额使用DECIMAL类型
  • 为日期时间使用适当的日期时间类型
  • 为文本数据使用适当的字符串类型
  • 避免使用ENUM和SET类型,除非有特殊需求
  • 考虑使用JSON类型存储半结构化数据

下一步学习

了解了MySQL数据类型后,您可以继续学习: