MySQL中varchar类型的字段默认值设置方式
目录
- mysql varchar字段默认值设置
- Mysql Varchar 类型为什么默认设置 255?
- Mysql5.6.x
- Mysql5.7.x
- 总结
MySQL varchar字段默认值设置
最近开始给项目设计数据库,遇到一个可能很多人都会遇到的问题,就是设定某一个字段的默认值的时候,是设定null,“”,还是empty string呢?
我们从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, roundhttp://www.devze.comed up to the nearest byte.
所以 mysql设计表时 建议不要用default NULL
- string类型的可以default ''或者emptystring
- int类型的可以dhttp://www.devze.comefault 0
另外一点,从不同的项目开发去分析这个问题:
以前单纯做web网页端,对这个默认值设定问题选用null 还是empty string。
但是后来在另外一个团队开发app的时候,这个null和empty string的问题就尤为突出,因为我是用php做接口开发,如果一旦出现null的数据类型,没有处理直接返回去前端,那么无论是IOS还是android端,如果没有处理好这个空的判断,要么就直接输出null,要么程序直接报错。
编程客栈所有建议设计数据库的时候默认值尽量少用null。
Mysql Varchar 类型为什么默认设置 255?
Mysql5.6.x
在 Mysql5.6 版本下,单列索引的长度不能超过 767bytes,联合索引的长度不能超过 3072bytes
Mysql5.7.x
在 Mysql5.7 版本下,单列索引的长度不能超过 3072bytes,联合索引的长度不能超过 3072bytes
utf8
上面说到单列索引长度为 767,在 utf8 编码下,一个字符为 3bytes,那么 255*3=765,刚好为能够建立索引长度的最大值,如果超出了这个值,如果使用的是 navicat 那么 mysql 会自动将这一列的索引变为前缀索引,截取 255
utf8mb4
在 utf8mb4 下,一个字符为 4bytes, 那么 编程客栈767÷4=191.75,取整为 191,所以在 utf8mb4 编码下,如果你的 varchar 超出 191,如果使用的是 navicat 那么 mysql 会自动将这一列的索引变为前缀索引,截取 191
为什么联合索引长度是 3072
我们知道 InnoDB 一个 page 的默认大小是 16k。由于是 Btree 组织,要求叶子节点上一个 page 至少要包含两条记录(否则就退化链表了)。
所以一个记录最多不能超过 8k。
又由于 InnoDB 的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过 4k (极端情况,pk 和某个二级索引都达到这个限制)。
由于需要预留和辅助空间,扣掉后不能超过 3500,取个 整数 就是 1024*3=3072
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程编程客栈(www.devze.com)。
精彩评论