我变了 my.cnf . 检查一下 sql_mode 使用下面的命令
my.cnf
sql_mode
select @@global.sql_mode;
上面写着,我也试过了
set global sql_mode=''; SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
但是。。。当我查询在not null列中插入null值时,它返回错误。。。如何关闭严格模式????????请帮帮我。。。。。
pxy2qtax1#
不能将not null列设置为null。描述了关闭sql模式的效果https://dev.mysql.com/doc/refman/5.7/en/constraint-invalid-data.html,如果您不使用严格模式,则每当您在列中插入“不正确”的值时,例如在非空列中插入null或在数字列中插入过大的数值,mysql将列设置为“最佳可能值”,而不是产生错误。。。如果试图将null存储到不接受null值的列中,则单行insert语句会出错。对于多行insert语句或对于insert into。。。select语句,mysql server存储列数据类型的隐式默认值。通常,数字类型的值为0,字符串类型的值为空字符串(“”),日期和时间类型的值为“0”这很容易理解onstrated:-
MariaDB [sandbox]> SET SESSION SQL_MODE = ''; Query OK, 0 rows affected (0.00 sec) MariaDB [sandbox]> SELECT @@sESSION.SQL_MODE; +--------------------+ | @@sESSION.SQL_MODE | +--------------------+ | | +--------------------+ 1 row in set (0.00 sec) MariaDB [sandbox]> select * from t; +----+------------+---------+ | id | dt | meeting | +----+------------+---------+ | 1 | 2017-12-20 | 1 | | 2 | 2017-12-20 | 1 | | 3 | 2017-12-20 | 1 | | 4 | 2017-12-22 | 1 | | 5 | 2017-12-25 | 1 | +----+------------+---------+ 5 rows in set (0.00 sec) MariaDB [sandbox]> INSERT INTO T (DT,MEETING) VALUES ('2018-01-01',NULL); ERROR 1048 (23000): Column 'meeting' cannot be null MariaDB [sandbox]> MariaDB [sandbox]> MariaDB [sandbox]> INSERT INTO T (DT,MEETING) VALUES ('2018-01-01',NULL),('2018-01-02',NULL); Query OK, 2 rows affected, 2 warnings (0.41 sec) Records: 2 Duplicates: 0 Warnings: 2 MariaDB [sandbox]> MariaDB [sandbox]> SELECT * FROM T; +----+------------+---------+ | id | dt | meeting | +----+------------+---------+ | 1 | 2017-12-20 | 1 | | 2 | 2017-12-20 | 1 | | 3 | 2017-12-20 | 1 | | 4 | 2017-12-22 | 1 | | 5 | 2017-12-25 | 1 | | 13 | 2018-01-01 | 0 | | 14 | 2018-01-02 | 0 | +----+------------+---------+ 7 rows in set (0.00 sec)
对于单插入,忽略扩展名
MariaDB [sandbox]> INSERT ignore INTO T (DT,MEETING) VALUES ('2018-01-10',NULL); Query OK, 1 row affected, 1 warning (0.02 sec) MariaDB [sandbox]> select * from t; +----+------------+---------+ | id | dt | meeting | +----+------------+---------+ | 1 | 2017-12-20 | 1 | | 2 | 2017-12-20 | 1 | | 3 | 2017-12-20 | 1 | | 4 | 2017-12-22 | 1 | | 5 | 2017-12-25 | 1 | | 13 | 2018-01-01 | 0 | | 14 | 2018-01-02 | 0 | | 15 | 2018-01-10 | 0 | +----+------------+---------+ 8 rows in set (0.00 sec)
允许插入,但如上所述存储隐式值。(这也适用于多行插入,不关心严格模式)警告:关闭sql模式和使用insert ignore是非常迟钝的工具,可能对数据库有害。
chhkpiq42#
这里的问题是MySQL5.1和之前允许在NOTNULL字段中插入null值,很多应用程序都是用这个规则编写的。对于dba来说,要想让所有的开发人员在不得不修改这么多代码的时候升级mysql是不容易的。
2条答案
按热度按时间pxy2qtax1#
不能将not null列设置为null。描述了关闭sql模式的效果https://dev.mysql.com/doc/refman/5.7/en/constraint-invalid-data.html,如果您不使用严格模式,则每当您在列中插入“不正确”的值时,例如在非空列中插入null或在数字列中插入过大的数值,mysql将列设置为“最佳可能值”,而不是产生错误。。。如果试图将null存储到不接受null值的列中,则单行insert语句会出错。对于多行insert语句或对于insert into。。。select语句,mysql server存储列数据类型的隐式默认值。通常,数字类型的值为0,字符串类型的值为空字符串(“”),日期和时间类型的值为“0”
这很容易理解onstrated:-
对于单插入,忽略扩展名
允许插入,但如上所述存储隐式值。(这也适用于多行插入,不关心严格模式)
警告:关闭sql模式和使用insert ignore是非常迟钝的工具,可能对数据库有害。
chhkpiq42#
这里的问题是MySQL5.1和之前允许在NOTNULL字段中插入null值,很多应用程序都是用这个规则编写的。
对于dba来说,要想让所有的开发人员在不得不修改这么多代码的时候升级mysql是不容易的。