我改变了my.cnf
。并检查sql_mode
使用以下命令
select @@global.sql_mode;
并且它说,
而且我也试过
set global sql_mode='';
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
但是......当我查询将空值插入非空列时,它返回错误...
如何关闭严格模式????????
请帮帮我......
答案 0 :(得分:2)
您不能将非空列设置为null。转换F sql模式的效果描述为https://dev.mysql.com/doc/refman/5.7/en/constraint-invalid-data.html, 如果您没有使用严格模式,那么无论何时向列中插入“不正确”值,例如将NULL插入NOT NULL列或将过大的数值插入数字列,MySQL都会将列设置为“最佳可能值”而不是产生错误 ... 如果尝试将NULL存储到不接受NULL值的列中,则单行INSERT语句会发生错误。对于多行INSERT语句或INSERT INTO ... SELECT语句,MySQL Server存储列数据类型的隐式默认值。通常,数字类型为0,字符串类型为空字符串(''),日期和时间类型为“零”值
这很容易证明: -
0.22 * 52.6 W
对于单个插入,忽略扩展名
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)
允许插入但如上所述存储隐式值。(这也适用于多行插入而不关心严格模式)
警告关闭sql模式并使用insert ignore是非常生硬的工具 - 可能对你的数据库有害。
答案 1 :(得分:0)
这里的问题是MySQL 5.1和之前允许INSERT NULL值进入NOT NULL字段,并且许多应用程序都是用这个规则编写的。
对于DBA来说,当他们需要更改这么多代码时,要对所有开发人员升级MySQL并不容易。