Mysql数据类型

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客

🌅主页:猫咪-9527-CSDN博客

"欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。"

目录

1.1数据类型分类

[1.2 数值类型](#1.2 数值类型)

[1.2.1 tinyint 类型](#1.2.1 tinyint 类型)

[1.2.2 bit 类型](#1.2.2 bit 类型)

[1.2.3 小数类型](#1.2.3 小数类型)

[1.2.3.1 float 类型](#1.2.3.1 float 类型)

[1.2.3.2 decimal 类型](#1.2.3.2 decimal 类型)

[1.3 字符串类型](#1.3 字符串类型)

[1.3.1 char 类型](#1.3.1 char 类型)

[1.3.2 varchar 类型](#1.3.2 varchar 类型)

[1.4 日期和时间类型](#1.4 日期和时间类型)

[1.5 enum 和 set 类型](#1.5 enum 和 set 类型)

[1.5.1 enum 类型](#1.5.1 enum 类型)

[1.5.2 set 类型](#1.5.2 set 类型)

[1.6 find_in_set函数](#1.6 find_in_set函数)


1.1数据类型分类

MySQL 数据类型可以分为三大类:

  1. 数值类型:包括整数类型、浮点类型、定点类型等。
  2. 字符串类型 :包括 CHARVARCHARTEXT 等。
  3. 日期和时间类型 :包括 DATEDATETIMETIMESTAMP 等。
1.2 数值类型

数值类型在 MySQL 中主要有整型和小数型两种类型。

1.2.1 tinyint 类型

tinyint 类型是一个小的整数类型,通常用于存储小范围的整数。

  • 范围
    • 有符号:-128 到 127
    • 无符号:0 到 255
    • 如果插入超出该范围的值,MySQL 会报错。

示例:

复制代码
CREATE TABLE tt1 (num tinyint);
INSERT INTO tt1 VALUES(1);   -- 成功插入
INSERT INTO tt1 VALUES(128); -- 报错,超出范围

有符号正数:

​ 有符号负数:

无符号数:

1.2.2 bit 类型

bit 类型用于存储位字段,可以存储二进制数据。

示例:

复制代码
CREATE TABLE tt4 (id INT, a BIT(8));
INSERT INTO tt4 VALUES(10, 10); -- 存入10,显示可能是位二进制值

(bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。)

  • 你可以定义存储的位数,例如 bit(8) 表示存储 8 位的二进制数。
  • 默认情况下,bit 类型在存储时会显示为 ASCII 字符。

注:bit字段在显示时,是按照ASCII码对应的值显示

1.2.3 小数类型
1.2.3.1 float 类型

float 类型用于存储浮动的小数值,支持四舍五入。

  • 你可以通过 float(M, D) 来定义精度和小数位数,其中 M 为总位数,D 为小数位数。

示例:

复制代码
CREATE TABLE tt6 (id INT, salary FLOAT(4, 2));
INSERT INTO tt6 VALUES(100, -99.99);  -- 成功插入
INSERT INTO tt6 VALUES(101, -99.991); -- 会进行四舍五入,存储为 -99.99

案例:

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

如果是无符号数的float,其中的负数部分会被舍去。例如:

无符号小数:float(4,2)表示的范围是0 ~ 99.99,MySQL在保存值时会进行四舍五入。

1.2.3.2 decimal 类型

decimal 类型是定点数,精度更高,适用于需要精确存储小数的情况。

  • decimal(M, D) 表示最多可以存储 M 位数,其中 D 位是小数部分。

示例:

复制代码
CREATE TABLE tt7 (id INT, salary DECIMAL(5, 2));
INSERT INTO tt7 VALUES(100, 99.99);  -- 成功插入

注: decimal类型和float类型很像,他们都支持四舍五入,他们的无符号类型都是舍去负数,但是decimal类型的精度比float类型更高。

例如:

1.3 字符串类型
1.3.1 char 类型

char 是固定长度的字符串类型,适用于存储长度固定的字符串数据。

  • 长度 L 最大为 255 字符。

示例:

复制代码
CREATE TABLE tt9 (id INT, name CHAR(2));
INSERT INTO tt9 VALUES(100, 'ab');    -- 成功插入
INSERT INTO tt9 VALUES(101, '中国');  -- 成功插入
1.3.2 varchar 类型

varchar 是可变长度的字符串类型,适用于存储长度不固定的字符串数据。

  • 最大长度是 65535 字节,实际存储的长度取决于字符集。

示例:

复制代码
CREATE TABLE tt10 (id INT, name VARCHAR(6));
INSERT INTO tt10 VALUES(100, 'hello');           -- 成功插入
INSERT INTO tt10 VALUES(100, '我爱你,中国');     -- 成功插入

请思考为什么会出现这种情况?

原因是:CHARVARCHAR 类型在 MySQL 中存储的是字符而非字节。在默认的 utf8 字符集下,每个字符通常占用 3 个字节。由于 VARCHAR 是可变长度的字符串类型,它不仅存储字符本身,还需要额外的空间来记录实际数据的长度。因此,在 utf8 编码下,VARCHAR 字段的最大字符数是 21844。这个限制是因为 VARCHAR 的最大字节数为 65535 字节,而每个字符占用 3 个字节,再加上存储长度的开销(最多 3 个字节),因此实际能存储的最大字符数为 65535 / 3 = 21845,减去存储长度所需的空间后,最终可以存储最多 21844 个字符。

1.3.3charVSvarchar

如何选择定长或变长字符串?

定长(CHAR

如果数据的长度确定且不会变化,使用定长(CHAR)类型更为合适。例如:身份证、手机号、MD5 值等。

变长(VARCHAR

如果数据的长度有变化,可以使用变长(VARCHAR)类型。例如:名字、地址等数据。

优缺点对比:


定长(CHAR

优点

  • 存储固定长度的数据时效率高。
  • 因为空间已经预分配,查询时访问速度较快。

缺点

  • 存储短于定义长度的数据时会浪费空间。
  • 例如,CHAR(10) 存储 3 个字符的数据时,会浪费 7 个字符的空间。

变长(VARCHAR

优点

  • 根据实际字符长度分配空间,节省存储。

缺点

  • 需要动态计算长度,相比 CHAR 稍慢。
  • 在频繁查询或更新时,效率可能较低
1.4 日期和时间类型

常用的日期和时间类型:

  • DATE :存储日期,格式为 'yyyy-mm-dd'
  • DATETIME :存储日期和时间,格式为 'yyyy-mm-dd HH:ii:ss'
  • TIMESTAMP:存储时间戳,从1970年1月1日开始计算。

1.5 enum 和 set 类型
1.5.1 enum 类型

enum 类型用于存储"单选"项。每个选项都有一个数字编号,对应存储在数据库中的实际值。

示例:

复制代码
CREATE TABLE votes (username VARCHAR(30), gender ENUM('男', '女'));
INSERT INTO votes VALUES('张三', '男');

​ enum里面的值默认下表从0开始,0表示空NULL

1.5.2 set 类型

set 类型用于存储"多选"项,可以选择多个值,值的组合会以数字标识。

示例:

复制代码
CREATE TABLE votes (username VARCHAR(30), hobby SET('登山', '游泳', '篮球', '武术'));
INSERT INTO votes VALUES('雷锋', '登山,游泳');

|-----|----|----|----|----|----|
| 爱好: | 爬山 | 登月 | 打球 | 游泳 | 睡觉 |
| 6 | 0 | 1 | 1 | 0 | 0 |
| 5 | 1 | 0 | 1 | 0 | 0 |

原因: SET 类型中的值是按二进制位存储的,每个选项对应一个二进制位。每个选项的值会用一个数字表示,数字的每一位代表一个选项的状态(是否选中)。这样可以节省存储空间。

1.6 find_in_set函数

find_in_set(sub, str_list) 函数用于查找一个字符串是否在由逗号分隔的字符串列表中。

  • 如果 substr_list 中,返回其位置(下标)。
  • 如果 sub 不在 str_list 中,返回 0。

示例:

  • find_in_set('a', 'a,b,c') 返回 1,表示 'a''a,b,c' 中的第一个位置。
  • find_in_set('d', 'a,b,c') 返回 0,表示 'd' 不在 'a,b,c' 中。

同时它可以让查找更方便

相关推荐
2301_802502331 小时前
哈工大计算机系统2025大作业——Hello的程序人生
数据库·程序人生·课程设计
大数据004 小时前
Docker慢慢学
mysql·docker·kafka·n8n
Alan3165 小时前
Qt 中,设置事件过滤器(Event Filter)的方式
java·开发语言·数据库
TDengine (老段)5 小时前
TDengine 集群容错与灾备
大数据·运维·数据库·oracle·时序数据库·tdengine·涛思数据
Lao A(zhou liang)的菜园6 小时前
高效DBA的日常运维主题沙龙
运维·数据库·dba
迪迦不喝可乐7 小时前
mysql知识点
数据库·mysql
愿你天黑有灯下雨有伞7 小时前
MyBatis-Plus LambdaQuery 高级用法:JSON 路径查询与条件拼接的全场景解析
mysql·json·mybatis
不太可爱的大白7 小时前
MySQL 事务的 ACID 四大特性及其实现原理
数据库·mysql
进击的CJR8 小时前
MySQL 8.0 OCP 英文题库解析(十)
mysql·adb·开闭原则
观测云8 小时前
HikariCP 可观测性最佳实践
数据库