MySQL系列之数据类型(String)

导览

  • 前言
  • 一、字符串类型知多少
    • 1. 类型说明
    • 2. 字符和字节的转换
  • 二、字符串类型的异同
    • 1. CHAR & VARCHAR
    • 2. BINARY & VARBINARY
    • 3. BLOB & TEXT
    • 4. ENUM & SET
  • 结语
  • 精彩回放

前言

MySQL数据类型第三弹闪亮登场,欢迎关注O。
本篇博主开始谈谈MySQL是如何存储字符串的,以及它有哪些规则或要求,如何正确的选择字符串类型等等话题。
马不停蹄,话不宜迟,咱们边聊边谈~
在这里插入图片描述

提示:本系列均以MySQL5.7版本为例,举例说明。

一、字符串类型知多少

先问问各位盆友,此时此刻,你们能够立即想到的MySQL字符串类型有哪些呢?
有位同学脱口而出:varchar,鼓掌~
有位同学大声喊出:text,鼓掌~
有位同学低声发出:char,接着鼓掌~
因为他/她们的回答都对,是吧?O(∩_∩)O哈哈~

事实上,答对了可能问题不大,但是答全了可能有点问题,接下来,博主提供一个完整答案吧,可供参考。

1. 类型说明

类型说明
CHAR字符类型,固定长度
VARCHAR字符类型,可变长度
TEXT字符类型,包括TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
BINARY字节类型,固定长度
VARBINARY字节类型,可变长度
BLOB字节类型,包含INYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
ENUM字符串对象,包含一个或多个枚举,比如(‘飞机’,‘高铁’)
SET字符串对象,可为空,可包含一个或多个字符串,比如(‘a’,‘b’)

通过以上类型,综合看MySQL的字符串类型存储的数据主要包括3类:字符、字节和枚举。String类型支持字符和字节的自动切换,通过什么方法实现呢?答案是CHARACTER SET

2. 字符和字节的转换

我们定义了一张表:

CREATE TABLE test1
(
  col1 VARCHAR(10) CHARACTER SET binary,
  col2 TEXT CHARACTER SET binary
);

它其实和下表的定义是相同的:

CREATE TABLE test2
(
  col1 VARBINARY(10),
  col2 BLOB
);

提示:这里实际发了的String类型的自动转换,遵循一个规则:字符类型如set二进制,则自动转换为二进制(字节)类型。如CHAR变BINARY,TEXT变BLOB。需要说明的是SET和ENUM不受此规则影响。

二、字符串类型的异同

1. CHAR & VARCHAR

  • CHAR和VARCHAR类型相似,但存储和检索方式不同。它们在最大长度和是否保留空格方面也有所不同。
  • CHAR和VARCHAR类型的声明长度表示要存储的最大字符数。比如CHAR(30)最多可容纳30个字符。
  • CHAR列的长度固定为创建表时声明的长度,支持0到255之间的任何值。当存储CHAR值时,如字符不足,会使用空格填充到指定的长度。检索CHAR值时,除非启用了PAD_CHAR_TO_FULL_LENGTH SQL模式,否则尾部空格将被删除。
  • VARCHAR列中的值是可变长度字符串。长度可以指定为0到65535之间的值。VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列之间共享)和使用的字符集。
  • 对于VARCHAR列,无论使用何种SQL模式,超过列长度的尾随空格在插入之前都会被截断,并生成警告。对于CHAR列,无论SQL模式如何,都会自动截断插入值中多余的尾随空格。
  • VARCHAR值在存储时不会被填充。

2. BINARY & VARBINARY

BINARY & VARBINARY类型和CHAR & VARCHAR类似,但是它们存储的是二进制字符串,而不是字符型字符串。这意味着它们具有二进制字符集和排序规则,所以比较和排序是基于字节完成。

但是BINARY & VARBINARY数据类型又不同于CHAR BINARYVARCHAR BINAR数据类型。对于后一种类型,BINARY属性不会导致该列被视为二进制字符串列。相反,它会导致使用列字符集的二进制(_bin)排序规则(或者如果没有指定列字符集,则使用表默认字符集),并且列本身存储非二进制字符串而不是二进制字节字符串。例如,如果默认字符集是latin1,则CHAR(5)BINARY被视为CHAR(6)character set latin1 COLLATE latin1_bin。这与BINARY(5)不同,BINARY存储具有二进制字符集和排序规则的5字节二进制字符串。

3. BLOB & TEXT

BLOB是一个二进制大对象,可以容纳可变数量的数据。其中又分为四种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。这些值的不同之处仅在于它们可以容纳的值的最大长度。与BLOB相似,TEXT类型也分四类:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。这些对应于四种BLOB类型,具有相同的最大长度和存储要求。

BLOB值被视为二进制字符串(字节字符串)。它们具有二进制字符集和排序规则,比较和排序基于列值中字节的数值。TEXT值被视为非二进制字符串(字符串)。它们具有二进制以外的字符集,并且根据字符集的排序规则对值进行排序和比较。

在某些情况下,可能需要将二进制数据(如媒体文件)存储在BLOB或TEXT列中。你可能会发现MySQL的字符串处理函数对于处理此类数据很有用。

提示:BLOB或TEXT对象的最大大小由其类型决定,但实际可以在客户端和服务器之间传输的最大值由可用内存量和通信缓冲区的大小决定。您可以通过更改max_allowed_packet变量的值来更改消息缓冲区大小,但必须对服务器和客户端程序都这样做。

4. ENUM & SET

ENUM是一个字符串对象,其值从表创建时明确。
ENUM类型具有以下优点:
在列具有有限可能值集的情况下进行紧凑的数据存储。比如:

CREATE TABLE desk(
    width VARCHAR(40),
    high VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);

那么SET又如何呢?
SET是一个字符串对象,可以有零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。由多个集合成员组成的SET列值由逗号(,)分隔的成员指定。其结果是SET成员值本身(不含逗号)。SET最多可以有64个不同的成员。

提示:一个表在其ENUM和SET列中不能有超过255个唯一的元素列表定义,这些列被视为一个组。

结语

本期博主介绍了MySQL中的字符串类型相关知识点,有些很重要,有些只需了解它,欢迎关注哦。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~


精彩回放


MySQL系列之数据类型(Date&Time)
MySQL系列之数据类型(Numeric)
MySQL系列之远程管理(安全)
MySQL系列之身份鉴别(安全)
MySQL系列之数据授权(安全)
MySQL系列之如何在Linux只安装客户端
MySQL系列之如何正确的使用窗口函数(基于8.0版本)
MySQL系列之数据导入导出
MySQL系列之索引入门(上)
MySQL系列之索引入门(下)


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程 | c | select实现多路IO转接服务器

poll实现多路IO转接服务器 基于该视频完成 04-poll函数实现服务器_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 要求:能看懂看,看不懂也没啥大事,现在基本都用epoll代替了 大家看视频思路吧,代码就是从讲义里面copy了一份…

数组专题leetcode

链表适合插入、删除,时间复杂度 O(1) 数组是适合查找操作,但是查找的时间复杂度并不为 O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn) 数组:内存连续的存储相同类型 【数组插入】: 如果在数组的末…

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…

nginx中的root和alias的区别

alias 在E:\\test\\目录下创建一个index.html文件 在nginx.conf文件配置alias,路径填写为绝对路径,但是要注意,这里结尾是文件夹的名字 然后下面的/aa/ 是随便起的名字,也不是文件夹的名字,在浏览器访问的使用的 在浏览器使用 …

MySQL之数据库三大范式

一、什么是范式? 范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。 (范式是具有最小冗余的表结构) 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式(1NF/2NF/3NF…

【昇腾】NPU ID:物理ID、逻辑ID、芯片映射关系

起因: https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查询所有NPU设备: [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…

TcpServer 服务器优化之后,加了多线程,对心跳包进行优化

TcpServer 服务器优化之后&#xff0c;加了多线程&#xff0c;对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…

ansible自动化运维(一)简介及清单,模块

相关文章ansible自动化运维&#xff08;二&#xff09;playbook模式详解-CSDN博客ansible自动化运维&#xff08;三&#xff09;jinja2模板&&roles角色管理-CSDN博客ansible自动化运维&#xff08;四&#xff09;运维实战-CSDN博客 ansible自动化运维工具 1.什么是自…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 &#xff0c;否则为 0 ) and表示(全为1时才为1&#xff0c;否则为0) and表示(全为1时才为1&#xff0c;否则为0)&#xff0c;逻辑或用|或 o r 表示 ( 有 1 就为 1 &#xff0c;都为 0 才为 0 ) or表示…

基于Spring Boot + Vue的摄影师分享交流社区的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

鸿蒙NEXT开发案例:世界时间表

【引言】 本案例将展示如何使用鸿蒙NEXT框架开发一个简单的世界时钟应用程序。该应用程序能够展示多个城市的当前时间&#xff0c;并支持搜索功能&#xff0c;方便用户快速查找所需城市的时间信息。在本文中&#xff0c;我们将详细介绍应用程序的实现思路&#xff0c;包括如何…

Windows如何安装Php 7.4

一、进入官网&#xff0c;选择其他版本 https://windows.php.net/download/ 二、配置环境变量 将解压后的php 路径在系统环境变量中配置一下 cmd 后输入 php-v

yosys内部数据结构

一、参考链接 1.Yosys内部结构doxygen文件 yosys-master: RTLIL Namespace Reference 2.yosys内部结构介绍 https://yosyshq.readthedocs.io/projects/yosys/en/docs-preview-cellhelp/yosys_internals/formats/rtlil_rep.html 二、概览 图 1 网表核心数据结构 如图 1所示…

Java性能调优 - 多线程性能调优

锁优化 Synchronized 在JDK1.6中引入了分级锁机制来优化Synchronized。当一个线程获取锁时 首先对象锁将成为一个偏向锁&#xff0c;这样做是为了优化同一线程重复获取锁&#xff0c;导致的用户态与内核态的切换问题&#xff1b;其次如果有多个线程竞争锁资源&#xff0c;锁…

window的conda环境下espeak not installed on your system问题解决

1 问题描述 windows的conda环境下运行VITS2模型预处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "D:\ml\vits2\filelists.py", line 63, in <module>text_norm tokenizer(text_norm, Vocab, cleaners, languagehps.dat…

wine的使用方法

wine版本 所有分支&#xff0c;新的主要版本&#xff1a; wine-x.0 All branches, release candidates:各分支、候选版本&#xff1a; wine-x.0-rcn Stable branch updates: 稳定分支更新&#xff1a; wine-x.0.z Development branch updates: wine-x.y wine *.exe “更改目…

深度学习笔记26_糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

深度学习的unfold操作

unfold&#xff08;展开&#xff09;是深度学习框架中常见的数据操作。与我们熟悉的卷积类似&#xff0c;unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动&#xff0c;不同的是&#xff0c;卷积是滑动后与核求乘积&#xff08;所以取名为卷积&#xff09;&#…

Redis篇-2--原理篇1--I/O多路复用机制(5种I/O模型,I/O多路复用)

I/O多路复用机制&#xff1a; Redis 是通过I/O多路复用机制来管理大量客户端连接。这使得redis可以实现通过单线程来处理多个客户端连接的请求&#xff0c;避免了为每个客户端创建独立的线程&#xff0c;从而减少了上下文切换的开销&#xff0c;提高了系统的并发性和性能。 理解…

计算机毕设-基于springboot的某学院兼职平台的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…