今天在插入一条数据时发生错误:
Field serverid doesn’t have a default value.
serverid是设置成了not null int类型的,但是插入的是'',就报了上面的错误。在另一台机子上则不会报错。很奇怪,找了几个小时,终于找到原因了。问题详细情况如下:
例如有张usr表,start设置为not null.
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY key ,
`start` int(255) NOT NULL,
`length` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
然后执行insert语句:
insert into user(length) values(1)
就报错了:
insert into user(length) values(1)
#1364 - Field 'start' doesn't have a default value
我在另一台机子上执行就没有问题。
在MySQL 5.0.2之后对数据输入进行了强制性的加严处理,并且保留了以前的MySQL对非法或不当值并不严厉的行为,MySQL默认是对数据进行加严处理,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。
在my.cnf中
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES (没找到这个)
其中:
STRICT_ALL_TABLES - Behave more like the SQL standard and produce errors when data is out of range.
STRICT_TRANS_TABLES - Behave more like the SQL standard and produce errors when data is out of range, but only on transactional storage engines like InnoDB.
由于mysql 5.6默认用innodb ,所以用STRICT_TRANS_TABLES也容易理解。用了这个选项的话,
那么数据库中如果是非空值的话就得设置默认值了,否则是报错的 。
假如无法看到my.ini,你可以执行以下SQL命令。
SQL: SELECT @@GLOBAL.sql_mode;
返回:
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION.
就说明启用严格模式了。