首页 > 数据库 >MySQL 数据类型详解

MySQL 数据类型详解

时间:2024-09-28 21:53:19浏览次数:8  
标签:存储 TIMESTAMP 数据类型 UNSIGNED bytes JSON 详解 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 数据类型,构建高效的数据库。感谢各位看官的观看,下期见,谢谢~

标签:存储,TIMESTAMP,数据类型,UNSIGNED,bytes,JSON,详解,MySQL,类型
From: https://blog.csdn.net/weixin_64178283/article/details/142622027

相关文章

  • Android页面跳转与返回机制详解
    在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。一、Activity之间的跳转Activity是Android应用的基本构建块,代表了一个用户界面的单一屏幕......
  • 第3周 3.2 数据类型
    2.2基本数据类型展开:JAVA数据类型思维导图graphLRA(数据类型)-->B1(基本数据类型)A-->B2(引用数据类型)B1-->C1(整数类型)B1-->C2(字符类型)B1-->C3(布尔类型)B1-->C4(浮点类型)C1-->D1(byte字节型)C1-->D2(short短整型)C1-->D3(int整型)C1-->......
  • MySQL安全加固
    安装mysql下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.6/mysq1-5.6.33-linux-glibc2.5x86_64.tar.gz解压:tar-zxvfmysql-5.6.33-linux-glibc2.5-x86_64.tar.gz复制解压后的mysql目录:cp-rmysql-5.6.33-linux-glibc2.5-x8664/usr/local/mysql添加用户组groupaddmysql......
  • MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键
    在MySQL数据库中,FOREIGNKEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGNKEY约束究竟是什么呢?让我们一起来深入了解一下。一、什么是FOREIGNKEY约束?FOREIGNKEY约束是一种用于建立两个表之间关系的约束。它通过在一个表中定义一个......
  • MySQL 性能剖析全攻略
    在使用MySQL数据库的过程中,性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题,我们需要对MySQL进行性能剖析。那么,如何在MySQL中进行性能剖析呢?本文将为你详细介绍。一、为什么要进行性能剖析?MySQL数据库在运行过程中,可能会出现各种性能问题,如查询速度慢......
  • 一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型
    前言近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地......
  • 数据类型的种类
    数据类型的作用1.决定变量中能存储什么类型的数据2.决定存储空间的大小int:通常4个字节32位(32个bit)8个比特(bit)分为一组为一个字节字节为最小的存储单位1024字节=1kB1024kB=1MB数据类型分类整数:short,int,long,longlong(表示的范围和大小不一样)short最小;longlong最大......
  • 【HTML|第1期】HTML5视频(Video)元素详解:从起源到应用
    日期:2024年9月9日作者:Commas签名:(ง•_•)ง积跬步以致千里,积小流以成江海……注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^-^1.01365=37.7834;0.99365=0.02551.02365=1377.4083;0.......
  • MySQL数据库基础
    一.知识框架一开始学数据库,我们要先大致了解一下整个体系是怎么样的,搭建起一个知识体系,方便记忆和学习。什么是数据库,由名可知,就是保存用户数据的程序就是数据库,那MySQL又是什么呢,其实MySQL就是一个应用软件,通过这个应用软件就可以创建数据库,能够对数据库进行增删查改等一系......
  • python 操作RabbitMq详解
    一、简介:RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取完成通信。而作为中间件的RabbitMq无疑是目前最流行的消息队列之一。    RabbitMq......