前言
本篇博主开始谈谈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 模式如何设置,插入值中多余的尾随空格都会被自动截断。
- 与 CHAR 类型不同,VARCHAR 类型的值在存储时不会进行填充操作。
2. BINARY 与 VARBINARY
BINARY
和 VARBINARY
类型与 CHAR
和 VARCHAR
类似,不过它们存储的是 二进制字符串,而非字符型字符串。这就意味着它们具备二进制字符集和排序规则,在进行比较和排序操作时是基于字节来完成的。
需要注意的是,BINARY
和 VARBINARY
数据类型与 CHAR BINARY
或 VARCHAR BINARY
数据类型存在差异。对于 CHAR BINARY
或 VARCHAR BINARY
这类类型,BINARY
属性并不会使该列被当作二进制字符串列来处理。相反,它会促使使用列字符集的二进制(_bin
)排序规则(若未指定列字符集,则使用表默认字符集),并且该列本身存储的是非二进制字符串,而非二进制字节字符串。例如,若默认字符集为 latin1
,那么 CHAR(5) BINARY
会被视作 CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin
。这与 BINARY(5)
不同,BINARY(5)
存储的是具有二进制字符集和排序规则的 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中的字符串类型相关知识点,有些很重要,有些只需了解它,欢迎关注哦。
走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~