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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL数据库基础:数据类型详解-文本字符串类型

前言


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


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


537ec523093d43a5b823e942408fc7a7.png


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

我有一篇文章已经把MySQL的时间类型数据梳理的十分完善了:


一文速学-玩转MySQL获取时间、格式转换各类操作方法详解


故时间类型数据就不再细讲了。本文主要详解的是文本字符串数据类型说明以及实际操作运用。主要


315284a579e3454a84441587c4cc88a2.png


一、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)
  );
INSERT INTO mytable1 (vc, c) VALUES ('abc', 'abc');

e03d89aa73b84baa8b8b5164825f581a.png

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


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


fc54d7a88792483b9a4460abf2d6fcb6.png

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

416c2d1c2e61490094ab86b9933a26e7.png


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


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


062b2443744540388b34e77881f06602.png


可见, 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;


bfe2d0b7da9e4ec3aea0b272028e1009.png

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

99d44b87c272457084d992311cff7c2e.png

三、ENUM类型


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


CREATE TABLE mytable3(
sex ENUM('男','女','unknow')
);
INSERT INTO mytable3
VALUES('男'),('女');
INSERT INTO mytable3
VALUES('UNKNOW');

831df77d93634f5696392f486cd578a8.png

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

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


111abe1c8d264b4a96d7a2761eabcc5f.png

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

c01b3f4ea65041e4b2b4e615c1f7451a.png

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


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


2636c2cc147a4820b657d62e4959fda8.png

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


1. INSERT INTO mytable3
2. VALUES(NULL)


76f32c6656c44732927892915699d75b.png

四、SET类型


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


成员个数范围(L表示实际成员个数) 占用存储空间
1<=L<=8 1个字节
9<=L<=16 2个字节
17<=L<=24 3个字节
25<=L<=32 4个字节
33<=L<=64 8个字节


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


CREATE TABLE mytable4(
sex SET('男','女','unknow')
);



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

9fd6d4e9256d4387bca8ba9243250b9f.png

b930e058a8f14cffb0f437874446adf4.png


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

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


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


bb7becf6aafc42a4bd0194dd66bf57b3.png


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


b846059707114a6ab65bcaf370604030.png

五、JSON类型


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

CREATE TABLE mytable5 (
     id_info JSON
     );

插入JSON数据。

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

abaf45d7c2b5403e891d3f9749ee7f2a.png

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

SELECT id_info->'$.name' as name,
       id_info->'$.address.city' as city
FROM mytable5

900a9b42f03e4757be09973562c28b6a.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
这篇文章介绍了如何在DBeaver中创建MySQL表的枚举(ENUM)字段,并探讨了MySQL中ENUM类型的一些行为特点,例如ENUM值的默认排序和在插入重复值时的表现。
37 1
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
|
29天前
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
33 5
|
9天前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
19 0
|
1月前
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
87 3
|
1月前
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
44 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
50 2
|
23天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
56 3
Mysql(4)—数据库索引
|
9天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
45 2
|
12天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
52 4
|
17天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?