第九章:第9节 MySQL基础篇——数据类型(字符串型)

更新于:2021-03-30 13:53:35


字符串型分为六种:


定长字符串char:需要设定长度值,不足设定值,则右侧自动填满空格;最大255个字符,有编码问题。


变长字符串varchar:需要设定长度值,最大65532个字节,实际还得考虑一行的其他字段所占的长度,因为一行的最大长度是65534个字节;实际长度以实际内容为准,但不超过设定值。有编码问题。


定长二进制字符串binary:类似char,应该设定长度值,只是按“二进制字节”保存存字符数据,最大255个字节,无编码问题。


变长二进制字符串varbinary:类似varchar,需要设定长度值,只是按“二进制字节”存字符数据,最大65532个字节,无编码问题。


文本列类型text:用于存储普通文本,不受行的最大长度的限制,同类还有:tinytext, mediumtext, longtext。


二进制列类型blob:用于存储二进制字节内容,不受行的最大长度的限制,同类的还有:tinyblob, mediumblob, longblob。


枚举类型enum: 类似单选项应用中的多个选项值,最大65535个选项值;使用形式:enum('value1', 'value2', ... );存储数据的时候其实存的是一个对应的数字序号(从1开始)。


set类型:类似多选项应用中的多个选项,最多64个选项,使用形式:set('value1', 'value2', ...); 内部存储的也是数字(依次为1,2,4,8, ....),但可以是多个值,比如5就表示2个值(1,4),14就表示3个值(2,4,8)


最基本最重要的3个:varchar、char、text

varchar类型:


可变长度字符串类型。这个是字符串数据类型用的最多的一种。


一个varchar类型的字段最多能存储多少字节?(是字节,不是字符,gbk编码的汉字一个字符最大占两个字节,utf-8编码的汉字一个字符最大占三个字节)


mysql中varchar类型的字段最大长度是65535字节,但是并不是能存这么多数据,字符串最大有效长度是65532字节。内容开头用1到2个字节表示实际字符串长度(字符串长度超过255时需要2个字节,255在MySQL4.0版本以下指的是字节,5.0版本以上指的是字符),还有1个字节用来表示null的(楠神也不是特别确定,以前听别人讲过)。

 

在gbk编码下,存储的都是汉字字符,最多能存(65535-1-2)/2 = 32766个汉字。

在utf-8编码下,存储的都是汉字字符,最多能存(65535-1-2)/3 = 21844个汉字。


以上都只是在非常理想的状态下才能达到这些存储最大值。


MySQL默认规定一条记录最大的长度是65535字节,所有的字段加在一起所占的字节数不能超过65535。所以如果一个字段就占满了65535字节,这一行记录就只能有这一个字段了(除了text、tinytext、mediumtext、longtext例外)。


varchar类型需要设定长度,就像这样:

1.png


varchar(200)括号里的数字指的是字节还是字符?MySQL4.0版本以下指的是字节,5.0版本以上指的是字符


`address` varchar(200) NOT NULL comment 'XXX路XXX号'


字段“address”最多能存储200个字符,超过200个字符存不进去。因为varchar是可变长度,200只是做的最大字符数限制,它的占用字节数以实际存储数据长度为准,比如存的字符串是“abc”,那它的实际字节大小是3+1。3是字符串的大小字节,1是表示字符串长度的字节。


char类型:


定长字符串类型,最多能存储256个字符。char类型也需要设定长度,长度单位是字符。如果存储的数据不足设定的长度,则会自动补空格填满。


这个地方楠神也是有疑问一直没解开,比如char(4)既可以存储4个ASCII码字符,也可以存储4个汉字字符,那这个字段实际占用字节数到底是4个字节还是12个字节(utf-8下),搜了好多文章,都没有做详细讲解,好多人都是把括号的数字当成字节去理解。这个问题有兴趣的朋友去研究下,搞不明白也没关系,不影响我们后面使用。

 

实际设计数据表中,varchar要比char用的多,一是char只能存256个字符,二是存储的数据大多长度不固定,用char会造成空间的浪费。但char相比varchar存储读取上效率高很多,如果适合用char的当然要首选char。


比如存用户的身份证号、IP地址、加密后的32个字符长度的密码……


char 与 varchar 差别:


1.png

text类型:


可以存储“超大文本”,且其实际的长度并不占用一行的长度。相对char和varchar,效率低。


比如往数据库里存一篇文章,可以选择text类型。


注意:text也是有限制的,最大不能超过65535字节(64KB)。如果存储的文章内容很长,可以选择mediumtext(16MB)、longtext(4GB)。


结论:


数据的检索效率是:char > varchar > text


经常变化的字段用varchar;


知道固定长度的用char;


大多情况下用varchar;


超过255字符的只能用varchar或者text;


能用varchar的地方不用text;


能够用数字类型的字段尽量选择数字类型而不用字符串类型(如手机号),这会降低查询和连接的性能,降低存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。


2个有关“选项”的文本存储形式:

enum:


专门用于方便存储类似表单中的“单选项”的值。

形式:

enum(‘选项1’,‘选项2’,‘选项3’,......)

这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们的数字值是:1, 2, 3,4, 5,。。。。。最多65535个选项值


在创建数据表时就要把选项填好:


1.png


试着用Navicat在“t2”里往“edu”字段添加数据,除了“1、2、3、4、初中、高中、大专、本科”,其他的字符串你是添加不进去的。


楠神做开发时也很少用enum类型,还是用整数型代替enum类型,像这种单选的值大多要参与业务逻辑,而不是仅做显示。


set:


专门用于方便存储类似表单中的“多选项”的值。

形式:

set (‘选项1’,‘选项2’,‘选项3’,......)

这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们对应的数字值是:1, 2,4, 8, 16,。。。。。最多64个选项值。


1.png


同样如果只是做纯显示可以用set,参与业务逻辑最好还是用整数型。


附图:


1.png


本节学习代码》》》