MySQL 数据类型详解

在MySQL数据库中,数据类型的选择对性能和存储效率有着至关重要的影响。选择正确的数据类型可以最大限度地利用资源,并提高查询速度。

一、数值类型详解

数值类型用于存储数字数据,根据数据范围和精度需求,MySQL提供多种整数和浮点数类型。

1. 整数类型
类型大小(字节)范围性能用途示例
TINYINT1有符号: -128 to 127 <br> 无符号: 0 to 255最优存储非常小的整数值,如状态码、性别gender TINYINT(1) 存储性别,0-女,1-男
SMALLINT2有符号: -32768 to 32767 <br> 无符号: 0 to 65535较优存储较小的整数值,如端口号、小型计数器port SMALLINT UNSIGNED 存储网页端口号,例如 80
MEDIUMINT3有符号: -8388608 to 8388607 <br> 无符号: 0 to 16777215存储中等范围的整数值city_id MEDIUMINT UNSIGNED 存储城市ID
INT4有符号: -2147483648 to 2147483647 <br> 无符号: 0 to 4294967295良好存储常规整数值,如用户ID、文章IDuser_id INT UNSIGNED AUTO_INCREMENT 存储自增用户ID
BIGINT8有符号: -9223372036854775808 to 9223372036854775807 <br> 无符号: 0 to 18446744073709551615存储超大整数值,如高精度时间戳、大文件大小timestamp BIGINT UNSIGNED 存储高精度时间戳(以纳秒为单位)

示例:

CREATE TABLE users (
    user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    age TINYINT UNSIGNED
);

选择整数类型的最佳实践:

  • 优先选择能够存储数据的最小整数类型: 这可以节省存储空间,提高查询性能。

  • 使用 UNSIGNED 关键字: 如果确定列中只存储非负数,可以使用 UNSIGNED 关键字,这可以将正数范围扩大一倍。

  • 避免使用 ZEROFILL 属性: ZEROFILL 属性会在数字前面填充零,但这会降低插入和更新性能,并且增加存储空间。

2. 浮点数类型
类型大小(字节)范围精度用途示例
FLOAT4单精度浮点数约7位有效数字存储需要小数部分但精度要求不高的数值,如温度temperature FLOAT(4,2) 存储温度,例如 25.5 ℃
DOUBLE8双精度浮点数约15位有效数字存储需要更高精度的浮点数值,如经纬度坐标、科学计算数据longitude DOUBLE 存储经度,例如 121.4737
DECIMAL可变精确数值用户指定适用于需要精确存储和计算的数值,如货币、金融数据price DECIMAL(10,2) 存储商品价格,例如 19.99 元

示例:

CREATE TABLE products (
    product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    price DECIMAL(10,2) NOT NULL
);

选择浮点数类型的最佳实践:

  • 避免使用浮点数进行精确比较: 由于浮点数存储方式的限制,直接比较两个浮点数可能会导致意外结果。应该使用 ROUND() 函数或其他方法进行比较。

  • 使用 DECIMAL 类型存储精确数值: DECIMAL 类型以字符串形式存储数值,可以保证精度,适用于金融等对精度要求高的应用场景。

  • 根据实际需求选择精度: FLOAT 和 DOUBLE 类型提供了默认精度,但 DECIMAL 类型需要指定精度。选择合适的精度可以节省存储空间。

二、日期和时间类型详解

MySQL 提供多种数据类型来存储日期和时间信息,每种类型都具有特定的格式和范围。

类型大小(字节)范围格式用途示例
DATE3'1000-01-01' to '9999-12-31'YYYY-MM-DD存储日期值,不包含时间部分birthday DATE 存储生日,例如 '1990-01-01'
TIME3'-838:59:59' to '838:59:59'HH:MM:SS存储时间值,不包含日期部分duration TIME 存储会议持续时间,例如 '01:30:00'
YEAR11901 to 2155YYYY存储年份值release_year YEAR 存储产品发布年份,例如 '2023'
DATETIME8'1000-01-01 00:00:00' to '9999-12-31 23:59:59'YYYY-MM-DD HH:MM:SS存储日期和时间值,但与时区无关registration_time DATETIME 存储用户注册时间,例如 '2023-04-15 14:30:00'
TIMESTAMP4'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTCYYYY-MM-DD HH:MM:SS存储时间戳值,与时区相关,自动更新last_updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 记录数据最后更新时间

示例:

CREATE TABLE articles (
    article_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    publish_date DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

选择日期和时间类型的最佳实践:

  • 根据实际需求选择合适的类型: 如果只需要存储日期信息,使用 DATE 类型即可,如果需要存储时间信息,则选择 TIME 或 TIMESTAMP 类型。

  • 使用 TIMESTAMP 类型记录创建时间和更新时间: TIMESTAMP 类型可以自动更新,并且与时区相关,方便进行时区转换。

  • 避免使用 YEAR(2): YEAR(2) 只存储两位数年份,容易造成歧义。建议使用 YEAR(4) 存储四位数年份。

三、字符串类型详解

MySQL提供了丰富的字符串类型来存储文本数据,每种类型都有其特定的长度限制和存储方式。

1. 字符串类型
类型大小描述性能用途示例
CHAR0-255 bytes定长字符串,不足长度会用空格填充较优存储固定长度的字符串,如邮编、MD5值zip_code CHAR(6) 存储邮编,例如 '100000'
VARCHAR0-65,535 bytes变长字符串,只存储实际字符,节省空间良好存储可变长度的字符串,如用户名、文章标题username VARCHAR(255) 存储用户名,例如 'johndoe'
TINYTEXT0-255 bytes短文本数据存储简短的文本内容,如评论标签tags TINYTEXT 存储商品标签,例如 '电子产品,手机,智能手机'
TEXT0-65,535 bytes长文本数据存储较长的文本内容,如文章内容content TEXT 存储博客文章内容
MEDIUMTEXT0-16,777,215 bytes中等长度文本数据summary MEDIUMTEXT 存储中等长度的文章摘要
LONGTEXT0-4,294,967,295 bytes超长文本数据较差存储超长的文本内容,如大型文档document LONGTEXT 存储用户上传的文件内容

示例:

CREATE TABLE comments (
    comment_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    article_id INT UNSIGNED NOT NULL,
    author VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

选择字符串类型的最佳实践:

  • 优先选择 VARCHAR: VARCHAR 类型可以根据实际内容动态调整长度,比 CHAR 类型更加灵活,节省存储空间。

  • 避免过度使用 TEXT 和 BLOB: TEXT 和 BLOB 类型存储的数据量较大,查询效率较低,应该尽量避免使用。

  • 为字符串列指定合适的字符集和排序规则: 这可以确保数据正确存储和排序,避免出现乱码等问题。

  • 使用 TEXT 类型存储长文本: 如果需要存储超过 VARCHAR 类型长度限制的文本,可以使用 TEXT 类型。

2. 枚举和集合类型
类型大小描述性能用途示例
ENUM1-255 bytes枚举类型,只能存储预定义的值良好存储有限的选项,如订单状态、性别order_status ENUM('pending', 'processing', 'shipped', 'delivered') 存储订单状态
SET0-64 bytes集合类型,可以存储多个预定义的值存储多个选项,如用户爱好hobbies SET('music', 'sports', 'reading', 'travel', 'cooking') 存储用户爱好,例如 'music,reading'

示例:

CREATE TABLE orders (
    order_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id INT UNSIGNED NOT NULL,
    order_status ENUM('pending', 'processing', 'shipped', 'delivered') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

使用枚举和集合类型的最佳实践:

  • 使用枚举类型代替字符串类型: 如果一个字段只有几种固定的可选值,使用枚举类型可以提高数据完整性,并且节省存储空间。

  • 避免在枚举类型中存储可变数据: 枚举类型的值应该在定义时就确定,并且不应该轻易修改。

  • 谨慎使用集合类型: 集合类型虽然可以存储多个值,但查询效率较低,应该谨慎使用。

四、二进制类型详解

MySQL 提供了多种二进制类型用于存储图片、视频、音频等二进制数据。

类型大小描述用途示例
BIT1-8 bytes位字段,存储0或1存储布尔值、标志位is_active BIT(1) 存储用户是否激活,例如 b'1'
BINARY0-255 bytes定长二进制数据uuid BINARY(16) 存储 UUID,例如 0x00112233445566778899aabbccddeeff
VARBINARY0-65,535 bytes变长二进制数据存储图片、视频等二进制文件avatar VARBINARY(65535) 存储用户头像
TINYBLOB0-255 bytes短二进制数据thumbnail TINYBLOB 存储图片缩略图
BLOB0-65,535 bytes二进制数据image BLOB 存储图片
MEDIUMBLOB0-16,777,215 bytes中等长度二进制数据video MEDIUMBLOB 存储视频
LONGBLOB0-4,294,967,295 bytes超长二进制数据document LONGBLOB 存储大型二进制文件

示例:

CREATE TABLE images (
    image_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    filename VARCHAR(255) NOT NULL,
    image_data LONGBLOB,
    uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

使用二进制类型的最佳实践:

  • 避免存储过大的二进制数据: 存储过大的二进制数据会影响查询性能,建议将大文件存储在文件系统中,并在数据库中存储文件路径。

  • 使用合适的二进制类型: 根据数据大小选择合适的二进制类型,避免浪费存储空间。

五、JSON类型详解

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

类型描述用途
JSON存储 JSON 格式数据存储灵活的、半结构化的数据,如产品属性、用户配置

示例:

CREATE TABLE products (
    product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    specifications JSON
);

INSERT INTO products (product_name, specifications) VALUES 
('Smartphone', '{ "color": "black", "memory": "128GB", "camera": "50MP" }');

使用 JSON 类型的最佳实践:

  • 使用 JSON 类型存储半结构化数据: JSON 类型非常适合存储半结构化数据,例如包含多个属性的对象。

  • 不要过度使用 JSON 类型: JSON 类型虽然灵活,但查询效率低于传统的关系型数据表。应该根据实际需求选择合适的存储方式。

  • 使用 JSON 函数进行数据操作: MySQL 提供了丰富的 JSON 函数,可以方便地对 JSON 数据进行查询、修改等操作。

本文详细介绍了 MySQL 数据类型,包括其特性、适用场景。希望各位看官通过本文的学习,能够更好地理解和应用 MySQL 数据类型,构建高效的数据库。感谢各位看官的观看,下期见,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值