数据类型
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的宽度,系统却不会截断