Welcome everyone

varchar的一些小细节

mysql 汪明鑫 882浏览 0评论

定长字符串  vs  变长字符串

varchar存放变长字符串,char存放定长字符串

 

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of  characters  you want to store. For example, CHAR(30) can hold up to 30 characters.

 

  • 定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的
  • char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。
  • CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
    VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
    VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

 

char的长度限制

长度的限制是0-255个字符

 

varchar的长度限制

varchar是不定长的,varchar类型的列是不定长的,在5.0版本以后的最大长度是65536字节(2^16),但是这个长度只是“系统长度”,这并不意味着你真的可以完全利用65536字节来存储数据,因为varchar是不定长的,所以需要前两个字节标记字段的实际长度,结尾还要用一个字节表示结束

varchar存储长度的概念

varchar(M)

如果 M<= 255,varchar用一个字节存储字符的长度

2的8次方就是256

如果M > 255,varchar就需要2个字节存储字符的长度

 

所以设计数据库字段的时候,只需要考虑字符串是否会超过255就可以了,其他不用考虑。需要注意的是,这里varchar(n)的n是字符长度,不是字节长度,实际占用空间跟字符编码有关。

当然能小还是要小,比如varchar(20)就够了,没必要varchar(64)

如果需要根据某字段排序,也需要考虑到sort buffer的大小,所以也不能太大

 

【注意】

  • UTF-8 状态下,单个 varchar 长度不能超过 (65535 – 2) / 3 = 21844;
  • 一行数据所有字段长度加起来不能超过 65535;
  • 如果需要存储超长文本,考虑使用 text 类型,只存储指针长度

 

关于text

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

1、经常变化的字段用varchar;

2、知道固定长度的用char;

3、超过255字节的只能用varchar或者text;

4、能用varchar的地方不用text;

 

为什么char的查询效率高

 

char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因。

 

 

如有任何问题敬请指正=-=

 

转载请注明:汪明鑫的个人博客 » varchar的一些小细节

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz