关于mysql设置varchar字段的默认值和null的区别,以及varchar和char的区别⼀、背景
根据业务需求,发现以前的同事在设计表的时候,很多字段都没有设置默认值。在mysql5.7版本之后,没有设定默认值的字段,在严格模式下是很容易报错的,所以我这边需要先给每个字段加上⼀个默认值。
对于常见的int类型,默认值为0就好,但是对于varchar类型呢,默认值是设置为’'还是Null呢?
⼆、‘’和null的区别
1、占⽤空间问题
mysql帮助文档(1)c语⾔:
'\0',这个表⽰空,需要消耗存储空间的。
NULL,则表⽰连这个\0都没有。
(2)、mysql:
1:空值('')是不占⽤空间的
2: MySQL中的NULL其实是占⽤空间的。官⽅⽂档说明:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, ro unded up to the nearest byte.”
可见为了表⽰某个字段是否为空是需要额外开辟空间存储Null值,⽽在C语⾔中空值’不占⽤存储空间。
不仅如此,不使⽤NULL可以提⾼索引效率,因为树形索引结构中将NULL也视作⼀般数据节点。
2、上⾯说到了null会影响索引效率
其实我们在初学mysql的时候,都会看到⼀段话,那就是mysql建议字段最好为不要为null,尽量为not null。
原话:
尽量避免NULL:应该指定列为NOT NULL,除⾮你想存储NULL。在MySQL中,含有空值的列很难进⾏查询优化。因为它们使得索引、索引的统计信息以及⽐较运算更加复杂。你应该⽤0、⼀个特殊的值或者⼀个空串代替空值。
null会影响索引的统计,⼀般会默认null为同⼀个值,这样这个索引的筛选价值就降低了,影响优化器的判断。当然也可以调整参数,使得null被认为是不同的值。
结论:也就是说,在设置默认值的时候,尽量不要⽤Null来当默认值,⽤空字符串(’’)会更好⼀些。带有null的默认值还是可以⾛索引的,只是会影响效率。当然,如果确认该字段不会⽤到索引的话,也是可以设置为null的
三、在统计时,’'和null的区别
这部分建议参考博客:
结论:
1:在进⾏count()统计某列的记录数的时候,如果采⽤的NULL值,会别系统⾃动忽略掉,但是空值是会进⾏统计到其中的。
2:判断NULL ⽤IS NULL 或者 is not null,SQL 语句函数中可以使⽤ifnull()函数来进⾏处理,判断空字符⽤ =''或者 <>''来进⾏处理
3: 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插⼊的列插⼊NULL值,则出现的值是当前系统时间。插⼊空值,则会出现 '000 0-00-00 00:00:00'
4:对于空值的判断到底是使⽤is null 还是 =''要根据实际业务来进⾏区分。
四、关于char和varchar的选⽤
1、定义
众所周知的,char是定长,⽽varchar是变长。
char(M)类型的数据列⾥,每个值都占⽤M个字节,如果某个长度⼩于M,MySQL就会在它的右边⽤空格字符补⾜.(在检索操作中那些填补出来的空 格字符将被去掉)在varchar(M)类型的数据列⾥,每个值只占⽤刚好够⽤的字节再加上⼀个⽤来记录其长度的字节(即总长度为L+1字节)。
2、哪个更合适
对于MyISAM表,尽量使⽤Char,对于那些经常需要修改⽽容易形成碎⽚的myisam和isam数据表就更是如此,它的缺点就是占⽤磁盘空间;
对于InnoDB表,因为它的数据⾏内部存储格式对固定长度的数据⾏和可变长度的数据⾏不加区分(所有数据⾏共⽤⼀个表头部分,这个标头部分存放着指向 各有关数据列的指针),所以使⽤char类型不见得会⽐使⽤varchar类型好。事实上,因为char类型通常要⽐varchar类型占⽤更多的空间, 所以从减少空间占⽤量和减少磁盘i/o的⾓度,使⽤varchar类型反⽽更有利。
3、结论
1、在确定字段为短⼩且定长的时候,⽤char会好⼀些
2、在某字段需要频繁改写的时候,⽤char会好⼀些(因为varchar每次存储都要有额外的计算,得到长度等⼯作,如果⼀个⾮常频繁改变的,那就要有很多的精⼒⽤于计算,⽽这些对于char来说是不需要的。)
3、设计varchar()值的时候,不要⼀股脑的都⽤varchar(255):mysql会把表信息放到内存中(查询第⼀次后,就缓存住 了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很⼤就会有问题。
4、关于varchar(255)和varchar(256) :根据mysql官⽅⽂档,varchar(255)需要⼀个字节记录字段的长度 256以上需要两个字节记录长度。设置长度超过256会有点浪费。
5、因为在业务中使⽤innoDB多⼀些,所以尽量还是⽤varchar()好⼀些
end
=====================================================================
18年5⽉26⽇更新:
在设置字段的时候,可以给字段设置为 not null ,因为 not null 这个概念和默认值是不冲突的。我们在设置默认值为’'的时候,虽然避免了null的情况,但是可能存在直接给字段赋值为null,这样数据库中还是会出现null的情况,所以强烈建议都给字段加上 not null。
就这样的:
alter table 数据表 modify `字段名` VARCHAR (255) NOT NULL DEFAULT '';
=======================================================================
18年8⽉8⽇更新
既然上⾯都说了varchar字段的默认值最好不要为null,那么我们平时建表的时候改怎么写呢?特别是在phpmyadmin中:
1、如果字段是int类型,默认为0
2、如果是varchar类型,默认值留空就好。就是定义,然后留空,直接空格就可以。这个时候我们查看数据表的结构,就会发现该字段是有默认值的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。