前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >char、varchar、binary和varbinary的区别与联系

char、varchar、binary和varbinary的区别与联系

作者头像
用户7657330
发布2020-08-14 15:12:50
发布2020-08-14 15:12:50
1.2K0
举报
文章被收录于专栏:程序生涯程序生涯

char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。 如果需要存储的字符串的长度跟所有值的平均长度相差不大,适合用char,如MD5。 对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片。 对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度。 varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储 例外:Myisam引擎中使用ROW_FORMAT=FIXED时,每行使用相同的空间,造成浪费 char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较

+-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(4) | YES | | NULL | | | addr | char(8) | YES | | NULL | | | bn | varbinary(4) | YES | | NULL | | | b | binary(8) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ +----------------------+----------------------+ | concat("",addr,"asdf | a | | asdf | a | | a | a | | a | a | | t a | a | +----------------------+----------------------+ mysql> select * from zcy where name='a '; //由于name是varchar,比较时,'a '自动转换为'a'

+----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 3 | a | a | ab | ab | | 4 | a | a | ab | a | +----+------+------+------+----------+ 2 rows in set (0.00 sec) mysql> select * from zcy where name='a'; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 3 | a | a | ab | ab | | 4 | a | a | ab | a | +----+------+------+------+----------+ 2 rows in set (0.00 sec) +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(4) | YES | | NULL | | | addr | char(8) | YES | | NULL | | | bn | varbinary(4) | YES | | NULL | | | b | binary(8) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ +--------------------+-------------------+ | concat("",b,"ab a | NULL | | ab | ab | | ab | ab | | ab | a | | NULL | a | | NULL | abcde | | NULL | abcd1234 | +--------------------+-------------------+ binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制 binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节 进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速 按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格 mysql> select * from zcy where b='a\0\0\0\0\0\0\0'; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 5 | t a | a | NULL | a | +----+------+------+------+----------+ mysql> select * from zcy where b='a \0\0\0\0\0\0'; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 4 | a | a | ab | a | +----+------+------+------+----------+ varbinary保存变长的字符串,后面不会补\0 mysql> select * from zcy where bn='ab'; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 3 | a | a | ab | ab | +----+------+------+------+----------+ 1 row in set (0.01 sec) mysql> select * from zcy where bn='ab '; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 2 | asdf | a | ab | ab | +----+------+------+------+----------+ 1 row in set (0.00 sec) mysql> select * from zcy where bn='ab '; +----+------+------+------+----------+ | id | name | addr | bn | b | +----+------+------+------+----------+ | 4 | a | a | ab | a | +----+------+------+------+----------+ 1 row in set (0.00 sec)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档