建立一个测试表
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 好多了。。(这是题外话了,不用回答喽。。)
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 好多了。。(这是题外话了,不用回答喽。。)
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货