mysql sqlmode是非严格的\u模式但它不是空的和返回错误

zpgglvta  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(285)

我变了 my.cnf . 检查一下 sql_mode 使用下面的命令

select @@global.sql_mode;

上面写着,

我也试过了

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

但是。。。当我查询在not null列中插入null值时,它返回错误。。。
如何关闭严格模式????????
请帮帮我。。。。。

pxy2qtax

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是非常迟钝的工具,可能对数据库有害。

chhkpiq4

chhkpiq42#

这里的问题是MySQL5.1和之前允许在NOTNULL字段中插入null值,很多应用程序都是用这个规则编写的。
对于dba来说,要想让所有的开发人员在不得不修改这么多代码的时候升级mysql是不容易的。

相关问题