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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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月前
|
SQL 数据库 开发者
达梦数据库 【-6111: 字符串转换出错】问题处理
在更新数据库某个值属性时,遇到了“字符串转换出错”的错误。经过分析,发现是由于 `id` 字段实际上是字符串类型而非数值类型导致的。最终通过将 `id` 的值改为字符串类型解决了问题。此问题提醒我们在处理数据库时要仔细检查表结构,不要凭经验臆断字段类型。
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
56 15
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
38 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
126 3
|
2月前
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
49 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
55 2
|
3月前
|
自然语言处理 关系型数据库 MySQL
match如何在mysql数据库里进行文本的相似度排序?
【9月更文挑战第1天】match如何在mysql数据库里进行文本的相似度排序?
123 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
210 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
541 0
|
6天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
60 15