【MYSQL】MYSQL学习的一大重点:MYSQL数据类型

【MYSQL】MYSQL学习的一大重点:MYSQL数据类型

头像

🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

文章目录


在这里插入图片描述

0 ~> int:最佳实践

整数后面的圆括号里的内容我们暂时还不清楚,但是bit后面的圆括号我们知道了,就是:你想带几个bit

mysql> show tables; Empty set(0.00 sec) mysql>select database(); +------------+ | database()| +------------+ | d4 | +------------+ 1 row inset(0.00 sec) mysql> create table if not exists t1( ->id int, -> online bit(65) ->); ERROR 1439(42000): Display width out of range forcolumn'online'(max =64) mysql> create table if not exists t1(id int, online bit(64)); Query OK, 0 rows affected (0.04 sec) mysql> desc t1; +--------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------+------+-----+---------+-------+ |id| int | YES || NULL ||| online | bit(64)| YES || NULL || +--------+---------+------+-----+---------+-------+ 2 rows inset(0.00 sec) mysql> drop table t1; Query OK, 0 rows affected (0.02 sec) mysql> create table if not exists t1(id int, online bit ); Query OK, 0 rows affected (0.03 sec) mysql> desc t1; +--------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------+------+-----+---------+-------+ |id| int | YES || NULL ||| online | bit(1)| YES || NULL || +--------+--------+------+-----+---------+-------+ 2 rows inset(0.01 sec)

1 ~> 数据类型分类

1.1 数值类型

数据类型说明
BIT(M)位类型。M指定位数,默认值1,范围1-64
TINYINT [UNSIGNED]带符号的范围-128127,无符号范围0255。默认有符号
BOOL使用0和1表示真和假
SMALLINT [UNSIGNED]带符号是-2^15次方 到 215-1,无符号是216-1
INT [UNSIGNED]带符号是-2^31次方 到 231-1,无符号是232-1
BIGINT [UNSIGNED]带符号是-2^63次方 到 263-1,无符号是264-1
FLOAT [(M, D)] [UNSIGNED]M指定显示长度,d指定小数位数,占用4字节
DOUBLE [(M, D)] [UNSIGNED]表示比float精度更大的小数,占用空间8字节
DECIMAL (M, D) [UNSIGNED]定点数M指定长度,D表示小数点的位数

1.2 文本、二进制类型

数据类型说明
CHAR (size)固定长度字符串,最大255
VARCHAR (SIZE)可变长度字符串,最大长度65535
BLOB二进制数据
TEXT大文本,不支持全文索引,不支持默认值

1.3 时间日期

数据类型说明
DATE/DATETIME/TIMESTAMP日期类型(yyyy-mm-dd) (yyyy-mm-dd hh:mm:ss) timestamp时间戳

1.4 String类型

数据类型说明
ENUM类型ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值
SET类型SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号隔开。这样set成员值本身不能包含逗号。

2 ~> 数值类型

类型字节最小值(有符号/无符号)最大值(有符号/无符号)
TINYINT1-128 / 0127 / 255
SMALLINT2-32768 / 032767 / 65535
MEDIUMINT3-8388608 / 08388607 / 16777215
INT4-2147483648 / 02147483647 / 4294967295
BIGINT8-9223372036854775808 / 09223372036854775807 / 18446744073709551615

2.1 TINYINT 类型

默认有符号,可通过 UNSIGNED 指定无符号。

示例:

-- 有符号 mysql>CREATETABLE ttl (num TINYINT); mysql>INSERTINTO ttl VALUES(1); mysql>INSERTINTO ttl VALUES(128);-- 越界,报错 ERROR 1264(22003): Outof range valueforcolumn'num' at row1-- 无符号 mysql>CREATETABLE tt2 (num TINYINTUNSIGNED); mysql>INSERTINTO tt2 VALUES(-1);-- 越界,报错 ERROR 1264(22003): Outof range valueforcolumn'num' at row1 mysql>INSERTINTO tt2 VALUES(255);-- 成功

注意:尽量不要使用 UNSIGNED,因为可能仍然存不下较大数值,不如直接使用更大的类型(如 BIGINT)。

2.2 BIT 类型

语法:BIT[(M)],M 范围 1~64,默认 1。

存储为二进制值,查询时默认按 ASCII 码显示。

mysql>CREATETABLE tt4 (id INT, a BIT(8)); mysql>INSERTINTO tt4 VALUES(10,10); mysql>SELECT*FROM tt4;+------+------+| id | a |+------+------+|10||-- 10 对应 ASCII 不可见字符,所以显示为空+------+------+ mysql>INSERTINTO tt4 VALUES(65,65); mysql>SELECT*FROM tt4;+------+------+| id | a |+------+------+|10|||65| A |-- 65 对应 ASCII 'A'+------+------+

如果只存放 0 或 1,可定义为 BIT(1) 以节省空间。

mysql>CREATETABLE tt5 (gender BIT(1)); mysql>INSERTINTO tt5 VALUES(0),(1); mysql>INSERTINTO tt5 VALUES(2);-- 越界,报错 ERROR 1406(22001): Data too long forcolumn'gender' at row1

2.3 小数类型

2.3.1 FLOAT

  • 语法:FLOAT[(M,D)] [UNSIGNED],M 为显示长度,D 为小数位数,占用 4 字节。
  • 保存时会四舍五入。
mysql>CREATETABLE tt6 (id INT, salary FLOAT(4,2));-- 范围 -99.99 ~ 99.99 mysql>INSERTINTO tt6 VALUES(100,-99.99); mysql>INSERTINTO tt6 VALUES(101,-99.991);-- 四舍五入为 -99.99 mysql>SELECT*FROM tt6;+------+--------+| id | salary |+------+--------+|100|-99.99||101|-99.99|+------+--------+
  • 无符号 FLOAT(4,2) UNSIGNED 范围 0 ~ 99.99。
mysql>CREATETABLE tt7 (id INT, salary FLOAT(4,2)UNSIGNED); mysql>INSERTINTO tt7 VALUES(100,-0.1);-- 警告,实际可能变为 0 mysql>INSERTINTO tt7 VALUES(100,0); mysql>INSERTINTO tt7 VALUES(100,99.99);

2.3.2 DECIMAL

  • 语法:DECIMAL(M,D) [UNSIGNED],定点数,M 为总位数,D 为小数位数。
  • 例如:DECIMAL(5,2) 范围 -999.99 ~ 999.99,无符号时 0 ~ 999.99。
  • 精度比 FLOAT 高,适合需要精确计算的场景(如金额)。
mysql>CREATETABLE tt8 (id INT, salary FLOAT(10,8), salary2 DECIMAL(10,8)); mysql>INSERTINTO tt8 VALUES(100,23.12345612,23.12345612); mysql>SELECT*FROM tt8;+------+-------------+-------------+| id | salary | salary2 |+------+-------------+-------------+|100|23.12345695|23.12345612|-- float 出现精度误差,decimal 精确+------+-------------+-------------+

FLOAT 精度约为 7 位有效数字,DOUBLE 约为 15 位。

DECIMAL 最大位数 M 为 65,小数位数 D 最大为 30。若省略 D,默认为 0;若省略 M,默认为 10。

  • 建议: 对精度要求高的数据使用 DECIMAL。

3 ~> 字符串类型

3.1 CHAR

语法:CHAR(L),L 为字符数,最大 255。

固定长度,存储时右补空格到指定长度,检索时会去掉末尾空格(但严格模式可能保留)。

mysql>CREATETABLE tt9 (id INT, name CHAR(2)); mysql>INSERTINTO tt9 VALUES(100,'ab'); mysql>INSERTINTO tt9 VALUES(101,'中国');-- 一个汉字算一个字符 mysql>SELECT*FROM tt9;+------+------+| id | name |+------+------+|100| ab ||101| 中国 |+------+------+ mysql>CREATETABLE tt10 (id INT, name CHAR(256));-- 错误,超过最大长度 ERROR 1074(42000): column length too big forcolumn'name'(max =255);useBLOBorTEXT instead 

3.2 VARCHAR

语法:VARCHAR(L),L 为字符数,但实际最大长度受字节数限制(最多 65535 字节)。

需要 1~3 字节额外空间记录数据长度,因此可用字节数为 65532。

不同字符集下最大字符数不同:

  • utf8mb4:每个字符最多 4 字节,最大字符数 ≈ 65532 / 4 = 16383。
  • utf8(即utf8mb3):每个字符最多 3 字节,最大字符数 ≈ 65532 / 3 = 21844。
  • gbk:每个字符 2 字节,最大字符数 ≈ 65532 / 2 = 32766。
-- utf8 编码下,最大可定义 21844 个字符 mysql>CREATETABLE ttl (name VARCHAR(21844))CHARSET=utf8; Query OK,0rows affected (0.01 sec)-- 21845 超出限制 mysql>CREATETABLE ttl (name VARCHAR(21845))CHARSET=utf8; ERROR 1118(42000): Row size too large....

3.3 CHAR 与 VARCHAR 对比

假设使用 utf8 字符集(每个字符最多 3 字节),CHAR(4)VARCHAR(4)对比如下:

实际存储内容CHAR(4) 存储方式(固定占用 4 字节)VARCHAR(4) 存储方式(可变,+1 字节记录长度)
‘abcd’4 个字符(12 字节)4 个字符 + 1 字节长度 = 13 字节
‘A’1 个字符右补 3 个空格(4 字节)1 个字符 + 1 字节长度 = 4 字节
‘Abcde’超出长度,插入失败超出长度,插入失败

4 ~> 日期和时间类型

类型格式占用字节说明
DATE‘yyyy-mm-dd’3仅日期
DATETIME‘yyyy-mm-dd HH:ii:ss’8日期和时间,范围 1000-01-01 ~ 9999-12-31
TIMESTAMP‘yyyy-mm-dd HH:ii:ss’4时间戳,范围 1970-01-01 ~ 2038-01-19
-- 创建表 mysql>CREATETABLE birthday (t1 DATE, t2 DATETIME, t3 TIMESTAMP);-- 插入数据(t3 自动填充当前时间) mysql>INSERTINTO birthday (t1, t2)VALUES('1997-7-1','2008-8-8 12:1:1'); mysql>SELECT*FROM birthday;+------------+---------------------+---------------------+| t1 | t2 | t3 |+------------+---------------------+---------------------+|1997-07-01|2008-08-0812:01:01|2023-01-0112:34:56|+------------+---------------------+---------------------+-- 更新数据时,TIMESTAMP 自动更新为当前时间 mysql>UPDATE birthday SET t1 ='2000-1-1'; mysql>SELECT*FROM birthday;+------------+---------------------+---------------------+| t1 | t2 | t3 |+------------+---------------------+---------------------+|2000-01-01|2008-08-0812:01:01|2023-01-0112:35:10|+------------+---------------------+---------------------+

注意: TIMESTAMP 的行为(自动初始化和自动更新)可以通过建表时的 DEFAULTON UPDATE 子句控制。


5 ~> ENUM 和 SET

5.1 ENUM(枚举)

单选类型,格式:ENUM('值1', '值2', ...)

实际存储为数字索引(从 1 开始),最多 65535 个选项。

插入时可以使用值本身或数字索引。

5.2 SET(集合)

多选类型,格式:SET('值1', '值2', ...)

实际存储为位图(每个选项对应一个比特位:1,2,4,8,…),最多 64 个选项。

插入时用逗号分隔多个值,如'登山,游泳'

5.3 示例:调查表

CREATETABLE votes ( username VARCHAR(30), hobby SET('登山','游泳','篮球','武术'),-- 多选 gender ENUM('男','女')-- 单选);-- 插入数据INSERTINTO votes VALUES('雷锋','登山,武术','男');INSERTINTO votes VALUES('Juse','登山,武术',2);-- 2 对应 '女'INSERTINTO votes VALUES('LiLei','登山','男');INSERTINTO votes VALUES('LiLei','篮球','男');INSERTINTO votes VALUES('HanMeiMei','游泳','女');

5.3.1 查询技巧

直接使用=查询 SET 列只能匹配完全相同的值,无法查找包含某一项的行。

应使用FIND_IN_SET()函数:FIND_IN_SET('登山', hobby)返回非 0 表示存在。

-- 错误:只能查出 hobby 正好等于 '登山' 的行SELECT*FROM votes WHERE hobby ='登山';-- 正确:查出所有包含 '登山' 的行SELECT*FROM votes WHERE FIND_IN_SET('登山', hobby);
  • 注意: 不建议在插入时直接使用数字编号,因为不利于阅读和维护。

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

结语:希望对学习MYSQL相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

MySQL查看命令速查表

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

openJiuwen集成蓝耘AI模型深度解析:从架构设计到企业级Agent实战部署

openJiuwen集成蓝耘AI模型深度解析:从架构设计到企业级Agent实战部署

前言 在人工智能技术从单纯的感知智能向认知智能演进的浪潮中,大语言模型(LLM)的成熟催生了AI Agent(人工智能体)这一全新的应用形态。AI Agent不再局限于传统的单指令执行,而是演进为具备自主感知、推理规划、决策执行能力的智能实体。在这一技术变革背景下,openJiuwen作为一个致力于提供灵活、强大且易用能力的开源Agent平台应运而生。本文将深度剖析openJiuwen的技术架构、核心优势,并基于真实的服务器部署环境,详细拆解从底层环境搭建到上层复杂智能体构建的全过程。 一、 Agentic AI时代的基础设施:openJiuwen概览 openJiuwen的定位不仅是一个开发工具,而是面向生产级应用的Agent全生命周期管理平台。它旨在解决当前大模型应用落地过程中面临的开发门槛高、协同调度难、运行稳定性差等痛点。通过提供标准化的开发框架与高可靠的运行引擎,openJiuwen支持开发者快速构建能够处理各类简单或复杂任务的AI Agent,并实现多Agent间的协同交互。 作为核心代码资产的入口,开发者能在这里查看项目的 Readme 文档、分支管理和最新提交

By Ne0inhk

用 OpenClaw + 飞书,快速搭建 5 个可协作的 AI 助理团队

多个飞书机器人 + 独立工作空间 + 互相协作 = 专业化分工的 AI 助理团队 写在前面 如何用 OpenClaw 搭建一套多 Agent 系统,让 AI 助理各司其职、协同工作?通过 OpenClaw 多 Agent 架构,你可以实现: * 多个独立的飞书机器人,每个人设不同 * 各自独立的工作空间,数据完全隔离 * 可以互相协作,通过 agentToAgent 通信 * 共享长期记忆,跨渠道信息同步 本文将详细介绍如何在腾讯云服务器上,用 OpenClaw 搭建一套飞书多 Agent 系统,包括完整配置流程、常见问题解决方案和实战协作案例。 目录 1. 为什么需要多 Agent 2. 前置准备 3. 5 个 Agent

By Ne0inhk
人工智能大模型应用开发:从微调适配到场景落地

人工智能大模型应用开发:从微调适配到场景落地

一、人工智能大模型应用开发:从微调适配到场景落地 1.1 本章学习目标与重点 💡 掌握大模型应用开发的核心流程,包括模型选型、微调适配、功能封装、部署上线等关键环节; 💡 熟练运用主流大模型框架(Hugging Face Transformers、LangChain、LlamaIndex 等),实现文本生成、问答系统、智能助手等常见应用; 💡 理解大模型微调的核心技术(全参数微调、LoRA、QLoRA 等),能够根据数据规模和硬件资源选择合适的适配方案; 💡 通过真实场景案例(企业知识库问答、智能客服、代码生成助手),掌握大模型从技术适配到业务落地的端到端开发能力。 ⚠️ 重点关注:大模型的上下文窗口限制、生成内容的准确性与安全性、微调过程中的显存优化、以及生产环境下的性能与稳定性平衡。 1.2 大模型应用开发基础:选型与环境搭建 大模型应用开发的第一步是明确业务需求,选择合适的模型并搭建稳定的开发环境。本节将从模型选型原则、主流开发框架介绍、环境搭建实操三个维度,为后续开发奠定基础。 1.2.1

By Ne0inhk
医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(三)

医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(三)

第5章 逻辑回归:疾病风险概率建模 逻辑回归(Logistic Regression)尽管名称中含有“回归”,但它实际上是一种广泛应用于分类任务的线性模型。在医疗领域,逻辑回归因其简单、高效、可解释性强,以及能够输出概率值的特点,成为疾病风险预测、诊断辅助、预后评估等任务的基石算法。本章将从算法原理出发,深入解析逻辑回归在医疗场景中的适用性,并通过实战案例展示从数据预处理、模型训练、结果解释到临床应用的完整流程。 5.1 算法原理 逻辑回归的核心思想是:通过线性回归的输出来估计样本属于某个类别的概率。它使用一个非线性函数(Sigmoid函数)将线性组合的实数输出映射到0到1之间的概率值,从而解决分类问题。 5.1.1 从线性回归到逻辑回归 线性回归模型试图用特征的线性组合来预测一个连续值: [ z = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + … + \theta_p x_

By Ne0inhk