目录
定长字符串 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(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的一些小细节
说点什么
您将是第一位评论人!