字符串型分为六种:
定长字符串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)
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类型需要设定长度,就像这样:
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 差别:
text类型:
可以存储“超大文本”,且其实际的长度并不占用一行的长度。相对char和varchar,效率低。
比如往数据库里存一篇文章,可以选择text类型。
注意:text也是有限制的,最大不能超过65535字节(64KB)。如果存储的文章内容很长,可以选择mediumtext(16MB)、longtext(4GB)。
结论:
数据的检索效率是:char > varchar > text
经常变化的字段用varchar;
知道固定长度的用char;
大多情况下用varchar;
超过255字符的只能用varchar或者text;
能用varchar的地方不用text;
能够用数字类型的字段尽量选择数字类型而不用字符串类型(如手机号),这会降低查询和连接的性能,降低存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
enum:
专门用于方便存储类似表单中的“单选项”的值。
形式:
enum(‘选项1’,‘选项2’,‘选项3’,......)
这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们的数字值是:1, 2, 3,4, 5,。。。。。最多65535个选项值。
在创建数据表时就要把选项填好:
试着用Navicat在“t2”里往“edu”字段添加数据,除了“1、2、3、4、初中、高中、大专、本科”,其他的字符串你是添加不进去的。
楠神做开发时也很少用enum类型,还是用整数型代替enum类型,像这种单选的值大多要参与业务逻辑,而不是仅做显示。
set:
专门用于方便存储类似表单中的“多选项”的值。
形式:
set (‘选项1’,‘选项2’,‘选项3’,......)
这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们对应的数字值是:1, 2,4, 8, 16,。。。。。最多64个选项值。
同样如果只是做纯显示可以用set,参与业务逻辑最好还是用整数型。
附图: