MySQL神功2.4 数据类型的细分之字符串类型
一、固定长度与可变长度字符串类型
1、固定长度字符串类型CHAR(M)
这里的M代表该类型可以存储字符数量,取值范围0~255。(不是字节)
CHAR(0) :只能储空字符串或者null
CHAR 和 CHAR(1) 等价,当我们省略参数时,CHAR默认长度为1个字符。
CHAR(2) :可以存储2个字符
......
CHAR(255) : 可以存255个字符
问:那姓名字段我们用什么长度?
答:这个....你问我,我问谁呀?:)
张三
孙兴华
斯琴高娃
斯琴格日乐
姓名是:司马义某某某 的人很多
你以为六个字就是上限了吗?下面两位明星
迪丽热巴全名: 迪丽热巴•迪力木拉提
古力那扎全名:古力那扎尔·拜合提亚尔
你以为这就是上限了吗?绝对不是!
所以说,这个问题无论是你问别人,还是问自己,都没有固定答案。
char(M):长度固定, 即每条数据占用等长字节空间;适合用于身份证号码、手机号码等。
在可视化界面,修改长度即可

小贴士:如果用代码新建字段,需要写成:CHAR(4) 这个我们以后再讲
问:你只说了长度,没有说存储空间是多少字节呀?
答:这与你用什么样的字符集有关系。
UTF-8字符集:长度 x 一个字符最多需要3字节 = 占用空间
我们以UTF-8字符集为例,CHAR(4) 需要占用 4 * 3字节 = 12字节
图2-53中的W就是根据你使用的字符集而定的。

我现在用生活中的例子来讲,你租一套3居室,每间屋子里一张单人床(限制你居住不能超过3人),你们两个人住进去,那么另一张空的单人床是用空气填充的。当有人口普查的工作人员来敲门,只需要登记你们两个人的信息,那个空气就不用登记了。但是,这套3居租金7000元/月,限最高住3人,只住2个人是你自己的问题,这租金是一分都不能少的。如果你有2个人,你可以租2居室。否则你就是在浪费钱。
2、可变长度字符串类型VARCHAR(M)
这里的M代表该类型可以存储最大字符数量,取值范围0~65535。(不是字节)
其实这样说是不严谨的。因为这与字段采用的字符集有关。

utf-8 (utf8mb3) varchar(21844) 计算方法:65535/3≈21844
uft8mb4 varchar(16383) 计算方法:65535/4≈16383

以utf8mb4字集为例,【长度】最大就到16383
注:我们现在用的MySQL 8.x版本已经将utf8mb4做为默认字符集了。

VAR在计算机语言中通常是定义变量的,比如 PowerBI的DAX语言、JS等
变量是什么?答:可以改变的值,这不就好理解了吗?
上面,我们举了一个姓名长度的例子,如果你的企业中姓名长度无法确定,可以使用可变长度字符串类型。如果你使用固定长度字符串类型,就好比2个人租3居室,浪费钱浪费空间。
问:那VARCHAR(M)中的 M有什么用?
答:M代表最多可以存多少个字符。一个宿舍里最多有8张床(上下铺),可能只住了3个学生,我没招够学生,也不能把另外5张床的钱分摊到你们3个学生身上呀。
问:那VARCHAR(M)占用多少字节?
答:
当 M x W < 256 时,你输入真实字符串字符数+1
当 M x W >= 256 时,你输入真实字符串字符数+2
M是你定义的长度,W刚才我们讲了依据字符集而定。我们以UTF-8为例,那W=3


当我们将M提高到100的时候,你看看。。。。。CHAR类型的劣势就显现出来了


CHAR与VARCHAR关于尾部空格的秘密
下图中,新建固定和可变两个字段

我输入时,张三后面都带有三个空格

因为我们新课程还没有学习代码,我们先引用老课程中的代码做个实验

我们使用【固定】字段连接【可变】字段时,空格就不显示

当我们使用【可变】字段连接【固定】字段时,就显示空格

总结:CHAR与VARCHAR的区别
CHAR速度快,但是大多数情况下浪费空间,会自动删除数据尾部的空格。
VARCHAR速度慢于CHAR,大多数情况下节省空间,不删除数据尾部的空格。
二、四种TEXT类型
(1)TINYTEXT:最大长度为255字符。(指1个字节算一个字符的情况下)
以UTF-8字符集为例,1个英文字母1个字节,1个汉字3个字节,每个字符最多占3字节
如果使用TINYTEXT类型来存储汉字,那最多可以存255 / 3 = 85个汉字。
验证方法:在Word中输入86个汉字(左下角有显示字数),复制到记事本,在从记事本复制到MySQL表中的TINYTEXT类型的字段,是无法保存的,删除一个汉字,就可以了保存了。
但是当我使用utf8mb4字符集时也只能保存85个汉字,这就奇怪了,于是我查询了MySQL官方手册中对于utf8mb4的解释是:

我的疑问是:
既然在utf8mb4仍然是255 / 3 = 85个汉字,那为什么varchar(M)新建字段时M的最大值在utf8mb4下就要用65535/4=16383,而不是65535/3呢
我有一个大胆的猜测,当新建字段的时候,utf8mb4会考虑到你将来会不会保存特殊字符(补充字符),所以它默认是最多4个字节一个字符来新建字段。但是,在实际中,你只有BMP字符,没有补充字符时,他仍然按最多3个字节一个汉字的标准。建议大家在文章评论区发表自己的观点,看看我的猜测是否正确。
小伙伴可能会有疑问,补充字符是什么?BMP字符是你常用的,特殊字符(补充字符)例如像4字节emoji表情就是,代表字符:😄😁 .....这些表情包。
MySQL 中的 utf8(utf8mb3) 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。
当遇到占4个字节的 UTF-8 编码,会存储异常。从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。到了8.0后的版本, utf8mb4 作为默认字符编码。
你理解了TINYTEXT类型,后面3个类型无非是容量大小的问题,根据你自己情况使用
(2)TEXT:最大长度为65536字符。(指1个字节算一个字符的情况下)
(3)MEDIUMTEXT:最大长度为16777215字符。(指1个字节算一个字符的情况下)
(4)LONGTEXT:最大长度为4294967295字符。(指1个字节算一个字符的情况下)
三、ENUM类型(普通话:单选)
例如,在性别输入时,我们可以选择男或女,可以通过下拉菜单选择

注意,这个字段类型在Navicat for MySQL中的使用方法
首先新建表时我们输入字段名、字段类型,然后下面箭头指示位置

在弹出的对话框中输入相关值,通过+号新增行(- 号是删除行),然后点确定

这时,字符串会出现在下面,切记,不可以手工在这里直接输入。

你会发现,ENUM类型的默认值是NULL,如果你想让他将第几个元素设置为默认值,只需要默认那里的下拉菜单中选择你的默认值。

还有一个小技巧,就是在这里的 "男","女" 就好比一个班级中的学生,从1~n都是有学号的,ENMU类型的学号叫索引,1="男" , 2="女" 如果还有其它元素,以此类推, 我们可以输入数字,保存再打开后,就会根据索引显示他们的值


ENUM类型最多可以有65535个元素。(这个本人没有核实过,因为我个人使用时,最多就是10个左右,再多,就好比大海里捞针,不现实了)
四、SET类型(普通话:多选)
SET类型最多64个元素。(这个本人没有核实过,实际使用中我个人没有使用超过10个元素的场景)
添加元素的方法与ENMU一样,都要从箭头处添加。

我们今后在表中就可以多选了

最后显示的结果是:

注意这里输入的值不能重复,例如,我们输入两次吃饭

点确定后虽然显示正常

但是保存的时候会告诉你不行

因为我们现在还没有进入代码部分,将来学习写代码时,还会有更多注意事项,我们到时再说。

MySQL合集教程: