导览
- 前言
- 一、字符串类型知多少
- 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 BINARY
或VARCHAR 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系列之索引入门(下)