mysql sqlmode是非strict_mode。但它检查不为空。并返回错误

时间:2018-01-04 07:41:05

标签: mysql

我改变了my.cnf。并检查sql_mode使用以下命令

select @@global.sql_mode;

并且它说,

screenShot

而且我也试过

set global sql_mode='';
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';

但是......当我查询将空值插入非空列时,它返回错误...

如何关闭严格模式????????

请帮帮我......

2 个答案:

答案 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并不容易。