Mysql数据类型

发布于:2025-03-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

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

目录

1.1数据类型分类

1.2 数值类型

1.2.1 tinyint 类型

1.2.2 bit 类型

1.2.3 小数类型

1.2.3.1 float 类型

1.2.3.2 decimal 类型

1.3 字符串类型

1.3.1 char 类型

1.3.2 varchar 类型

1.4 日期和时间类型

1.5 enum 和 set 类型

1.5.1 enum 类型

1.5.2 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' 中。

     

    同时它可以让查找更方便