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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
存储 关系型数据库 MySQL
9.2.5.2 【MySQL】XDES 类型
9.2.5.2 【MySQL】XDES 类型
10 0
9.2.5.2 【MySQL】XDES 类型
|
6天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
12天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
12天前
|
SQL 存储 关系型数据库
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
|
13天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks在同步mysql时报错Code:[Framework-02],mysql里面有个json类型字段,是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
30 0
|
13天前
|
关系型数据库 MySQL Java
Java时间转换为MySQL中的INT类型时间戳
Java时间转换为MySQL中的INT类型时间戳
|
14天前
|
存储 SQL 关系型数据库
【mysql】mysql中的数据类型知多少?
【mysql】mysql中的数据类型知多少?
|
14天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在使用 DataWorks 数据集成同步 PostgreSQL 数据库中的 Geometry 类型数据如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
24 0
|
14天前
|
分布式计算 关系型数据库 大数据
MaxCompute产品使用合集之怎么才可以将 PostgreSQL 中的 geometry 空间类型字段同步到 MaxCompute 或另一个 PostgreSQL 数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
16天前
|
关系型数据库 MySQL
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)

推荐镜像

更多