• MySQL数据库基础:数据类型详解-文本字符串类型


    前言

    正好趁着这次一起学习复习一下MySQL数据库的基本知识。也是一直在用这个数据库,有些基础的知识点长久不用就会遗忘,就比如数据类型溢出的问题,很多时候建表的时候随便给定个类似,结果导入数据的时候报错又得删表就很麻烦,如果提前做好数据长度设置可以有效的避免这个问题而且还能节省很多空间,因此对MySQL所有数据类型做个总结是一个值得的选择。

    最好的总结方式就是根据学习顺序整理出一张思维导图可以帮我们很快的梳理清楚思路:

    该系列文章将按照这个脉络行文,此系列文章将被纳入我的专栏一文速学SQL各类数据库操作,基本覆盖到使用SQL处理日常业务以及常规的查询建库分析以及复杂操作方方面面的问题。从基础的建库建表逐步入门到处理各类数据库复杂操作,以及专业的SQL常用函数讲解都花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。 我有一篇文章已经把MySQL的时间类型数据梳理的十分完善了: 故时间类型数据就不再细讲了。本文主要详解的是文本字符串数据类型说明以及实际操作运用。主要

    一、CHAR与VARCHAR类型

    他们两个都可以存储较短的字符串,char类型的字段长度是声明的时候就固定的,最小取值为0,最大取值为255。如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。对于CHAR类型的数据来说,定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。

    VARCHAR类型修饰的字符串是一个可变长的字符串,长度的最小值为0,最大值为65535。检索VARCHAR类型的字段数据时,会保留数据尾部的空格。 VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。 我们创建一个表来实验一下就知道了:

    create table mytable1(
    	vc VARCHAR(4),
    	c CHAR(4)
    	);      
    
    • 1
    • 2
    • 3
    • 4
    INSERT INTO mytable1 (vc, c) VALUES ('abc', 'abc');
    
    • 1

    此时没有空格正常插入,再来看看有空格的情况下:

    INSERT INTO mytable1 (vc, c) VALUES ('a  ', 'a  ');
    
    • 1

    SELECT LENGTH(vc), LENGTH(c) FROM mytable1;
    
    • 1

    vc保存的字符串空格占位保留,而char则不保留尾部空格。我们再追加一个b:

    SELECT CONCAT(vc, 'b'), CONCAT(c, 'b') FROM mytable1;
    
    • 1

    可见, VARCHAR类型的字段vc保留了尾部的空格,而CHAR类型的字段c则去除了尾部的空格。

    二、TEXT类型

    1.text

    Text用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT类型。在向TEXT类型的字段保存和查询数据时,不会删除数据尾部的空格,这一点和VARCHAR类型相同。

    create table mytable2(
    	t TEXT
    	);
    INSERT INTO mytable2 (t) VALUES ('a  ');
    SELECT LENGTH(t) FROM mytable2;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    SELECT CONCAT(t, 'b') FROM mytable2;
    
    • 1

    三、ENUM类型

    ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定,其所需要的存储空间由定义ENUM类型时指定的成员个数决定。当ENUM类型包含1~255个成员时,需要1个字节的存储空间;当ENUM类型包含256~65535个成员时,需要2个字节的存储空间。ENUM类型的成员个数的上限为65535个。

    CREATE TABLE mytable3(
    sex ENUM('男','女','unknow')
    );
    
    • 1
    • 2
    • 3
    INSERT INTO mytable3
    VALUES('男'),('女');
    
    INSERT INTO mytable3
    VALUES('UNKNOW');
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里可以发现ENUM是忽略大小写的,已声明的数据为准。

    当加入未定义的数值时就会报错:

    当添加多个定义的值,也会报错:

    可以使用索引进行枚举元素的调用,下标从 1 开始:

    INSERT INTO mytable3
    VALUES('1'),(2);
    
    • 1
    • 2

    没有限制非空的情况下,可以添加null值:

    INSERT INTO mytable3
    VALUES(NULL);
    
    • 1
    • 2

    四、SET类型

    SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64。当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的。

    成员个数范围(L表示实际成员个数)占用存储空间
    1<=L<=81个字节
    9<=L<=162个字节
    17<=L<=243个字节
    25<=L<=324个字节
    33<=L<=648个字节

    SET类型在存储数据时一定程度上,成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。

    CREATE TABLE mytable4(
    sex SET('男','女','unknow')
    );
    
    • 1
    • 2
    • 3
    INSERT INTO mytable4(sex)
    VALUES('男'),('男,女');
    
    • 1
    • 2

    可以向SET类型的字段中插入多个以逗号分隔的有效成员值。

    当向表中的SET类型的字段s插入重复的SET类型成员时,MySQL会自动删除重复的成员。

    INSERT INTO mytable4(sex)
    VALUES ('男,女,女');
    
    • 1
    • 2

    当向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。

    五、JSON类型

    在MySQL 5.7中,就已经支持JSON数据类型。在MySQL 8.x版本中,JSON类型提供了可以进行自动验证的JSON文档和优化的存储结构,使得在MySQL中存储和读取JSON类型的数据更加方便和高效。

    CREATE TABLE mytable5 (
         id_info JSON
         );
    
    • 1
    • 2
    • 3

    插入JSON数据。

    INSERT INTO mytable5 (id_info) VALUES ('{"name":"fanstuck", "age":23, "address":{"province":"zhejiang", "city":"hangzhou"}}');
    
    • 1

    当需要检索JSON类型的字段中数据的某个具体值时,可以使用“->”和“->>”符号。

    SELECT id_info->'$.name' as name,
    			 id_info->'$.address.city' as city
    FROM mytable5
    
    • 1
    • 2
    • 3

    点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

  • 相关阅读:
    K8s Kubernetes Namespave Pod Label Deployment Service 实战
    HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看
    RHCE8 资料整理(五)
    【C语言】C的编译过程&&预处理
    怎么将本地代码文件夹通过Git 命令上传到启智平台仓库
    乐鑫 ESP RainMaker® 系列文章
    455. 分发饼干
    使用Keras的面部表情识别
    计算机视觉的基本概念和技术有哪些?
    [附源码]计算机毕业设计springboot春晓学堂管理系统
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127786116