数据类型

1.varchar与char的区别

2.varchar(50)中50的涵义?宽度的意思是什么?

3.如果只是varchar,不写括号默认是多少位呢?varchar(m)占用多少存储空间?为什么不用考虑字符宽度?不用 length() * w字符宽度?

4.字符和字符串的关系是什么?

3.int(4)中4的涵义?最多能存放4位数,也即是9999以内的数字吗?

4.为什么MySQL这样设计?

 

 

 

而Mysql数据库,尝试把生活中出现的这些数据类型,概括出来

一共有3种数据类型

1.数字类型,TINYINT < SMALLINT<MEDIUMINT < INT < BIGINT < DECIMAL < FLOAT < DOUBLE < BIT

2.字符串类型,CHAR ,VARCAHR,BINARY,VARBINARY, EMUM,SET

TINYBLOB < BLOB <MEDIUMBLOB<LONGBLOB

TINYTEXT < TEXT < MEDIUMTEXT < LONGTEXT

3.时间类型,TIMESTAMP,DATETIME = DATE + TIME, YEAR

 


 

1.varchar与char的区别?

varchar和char的共同点,都属于非二进制的字符串,不需要用0,1表示什么

有如下几点不同

1.char是一种长度固定的类型,而varchar是一种长度可变得类型

其中var = variable 变量,可以变化的

2.对于字符串尾部空格的处理方式不同

create table t(
   id  int auto_increment primary key,
   text1 char(4),
   text2 varchar(4)
);
insert into t values (NULL,'123 ','123 '),(NULL,'1','1'),(NULL,'李','李');

对于一个char(4)的字符串类型,如果数据是'123',只有

那么存放到磁盘的时候,系统会给它的尾部填充一个'空格',好让它填充满4位

所以当数据的长度是变化时,使用char类型存储会花费更多的空间

然后查询出来的时候,mysql又会自动把后面的空格去掉,所以看不出差别  

 

这两个字符串的数据,尾部都有空格的

 检索数据的时候,char数据类型的字段,会做一个截取尾部空格的处理,而varchar则会保留

 3.varchar和char的取值范围的不同

char(m),m的取值范围 [0,255] ,转为二进制就是[00000000,11111111]

如果省略了m,那么就按照存储空间最小原则,默认为char(0),表示记录一个二进制bit位

varchar(m),m的取值范围[1,65535],转为二进制    1111,1111,1111,1111 就像IP地址那么多位

4.varchar在磁盘空间,会使用2个BYTE,来记录这个字符串的长度,就像数组的链式结构一样

 


 

3.如果只是varchar,不写括号默认是多少位呢?varchar(m)占用多少存储空间?为什么不用考虑字符宽度?不用 length() * w字符宽度?

如果varchar不指定范围的话,就会报错 

#内幕145

varchar(m) 占用存储空间跟数据的长度有关系,Length(数据)Byte + 2Byte 

它可以做到,一个字符占用一个字节长度,其中2Byte用来存放Length(m)这个值的 

如果varchar(100)存放的是'test'值,那么存储空间为 length('test')+2=6Byte

 

1.varchar(50)中50的意思是什么?

2.对其进行字符串的长度计算length()是否都为4?

3.字符和字符串的关系是什么?

类比varchar(4)的数据列,是否不能存放‘macbookair’这个单词呢?

结论,varchar(m),m指的是字符串的宽度,说明这个列最多存放4个字符

对于中文也是一样

字符的宽度,决定了最后一个字符“好”要被截取

所以varchar(50)的含义——这个列只能存放50位字符(不过是英文,还是中文,还是数字)

 

length()求的是字节Byte,也就是传说中的一个中文字,占用了两个字节Byte,也就是16个二进制比特值

不管是字符串类型,数字类型,或者是其他的类型,最后都会化身为计算机的基本单位——字节Byte,字节也与存储有关系

参考知乎答案:知乎-为什么磁盘内存都以Byte为单位

真正求有多少个字符串的是char_length()函数求的是有多少个char,即有多少个字符

 

 

int(4)中4的含义是什么?最多能存放4位数,也即是9999以内的数字吗?mysql为什么要这样设计?

int(4)照样可以存放5位的数值,那这个4用来干嘛的呢?

#技术内幕

                                           

这里说明,宽度与取值范围无关

                                                                                              

这里也说明,宽度与存储空间占用量无关,不管设置int(1)还是int(255)保存的值都是一样的

唯一存在的意义,如果你的数据没有达到定义的宽度,mysql会帮你在左边补0

如果你的数据超过int(m)中m的宽度,系统却不会截断

posted @ 2015-10-19 22:11  lawrence.li  阅读(213)  评论(0编辑  收藏  举报