建立一个测试表
CREATE TABLE `a` (
  `z` tinyint(2) NOT NULL DEFAULT '0',
  `n` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `m` varchar(255) COLLATE utf8_unicode_ci  NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我知道建表的时候字段尽量不用null(毕竟null不是个好玩意) ,但是关于有两个问题。一. NOT NULL DEFAULT ''  和  NOT NULL 到底有什么区别呢?
字面上, NOT NULL是默认不是null(但是默认又是什么呢?),NOT NULL DEFAULT '' 是默认不是null,默认为''(空字符串 也就是Empty String)。二.我用5.6.17版本在刚才建的表用  INSERT INTO `a`(`z`, `n`) VALUES ('1','xiaohong');  运行正常  5.6.21  却报错  #1364 - Field 'm' doesn't have a default value 这是为什么呢?  INSERT INTO `a`(`z`, `n`,`m`) VALUES ('1','xiaohong',`xiaozhang`);  却可以。把上面表语句的 NOT NULL 改为 NOT NULL DEFAULT '' 就可以了。从报错信息看是没有默认值,但是为什么5.6.17就正常?我初步猜测是因为5.6.17默认NOT NULL=NOT NULL DEFAULT '' 也就是说not null 时,默认等于当前字段类型的空值(varchar=''   int=0),而在 5.6.21却不这么做,只能更加规范的sql语句才可以。只能用NOT NULL DEFAULT '' 。请大婶帮我解答下这两个问题,以及好的建议。谢谢大家。新人。给大家问好。听说csdn全是大婶。!嘿嘿嘿
最后我还想无奈的表达一下。为什么mysql放到其他数据库板块呢。。真的就这么不受到重视么。。我感觉mysql比sql sever 好多了。。(这是题外话了,不用回答喽。。)