永发信息网

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

答案:2  悬赏:80  手机版
解决时间 2021-01-27 15:46
  • 提问者网友:焚苦与心
  • 2021-01-27 11:28
char,varchar,binary和varbinary的区别与联系
最佳答案
  • 五星知识达人网友:低血压的长颈鹿
  • 2021-01-27 11:55
binary 和 varbinary
固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。

binary [ ( n ) ]
固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n+4 字节。

varbinary [ ( n ) ]
n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际输入数据长度 +4 个字节,而不是 n 个字节。输入的数据长度可能为 0 字节。在 SQL-92 中 varbinary 的同义词为 binary varying。

注释
如果在数据定义或变量声明语句中没有指定 n,默认长度为 1。如果没有用 CAST 函数指定 n,默认长度为 30。

当列数据项大小一致时应使用 binary。

当列数据项大小不一致时应使用 varbinary。

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

大型对象
BLOB就是使用二进制保存数据。
如:保存位图。
CLOB使用CHAR来保存数据。
如:保存XML文档。

MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 中等16M
LongBlob 最大 4G
全部回答
  • 1楼网友:纵马山川剑自提
  • 2021-01-27 12:48
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("$",name,"$") | 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("$",bn,"$") | 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)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯