MySQL在NOT NULL列中插入NULL值的记录

11

为什么针对table2的第一个INSERT会成功。请注意,table2.col_1不为空。它不会插入col_1的NULL值,但会神秘地将NULL值转换为空字符串。我正在使用MySQL版本5.5.28。谢谢。

mysql> DROP TABLE IF EXISTS table1, table2;

Query OK, 0 rows affected (0.01 sec)   

mysql> CREATE  TABLE IF NOT EXISTS table1 (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    -> col_1 VARCHAR(45) NOT NULL ,
    -> col_2 VARCHAR(45) NOT NULL ,
    -> PRIMARY KEY (`id`))
    -> ENGINE = InnoDB;

Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE table2 LIKE table1;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO table1 (id, col_1, col_2) VALUES (NULL, "xxx","yyy");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO table2 (id, col_1, col_2) SELECT NULL, NULL, col_2 FROM table1 WHERE id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 1

mysql> SHOW WARNINGS;
+---------+------+-------------------------------+
| Level   | Code | Message                       |
+---------+------+-------------------------------+
| Warning | 1048 | Column 'col_1' cannot be null |
+---------+------+-------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM table2;
+----+-------+-------+
| id | col_1 | col_2 |
+----+-------+-------+
|  1 |       | yyy   |
+----+-------+-------+
1 row in set (0.00 sec)

mysql> INSERT INTO table2 (id, col_1, col_2) VALUES( NULL, NULL, "zzz");
ERROR 1048 (23000): Column 'col_1' cannot be null

mysql> SELECT * FROM table2;
+----+-------+-------+
| id | col_1 | col_2 |
+----+-------+-------+
|  1 |       | yyy   |
+----+-------+-------+
1 row in set (0.00 sec)

可能它插入了NULL字符串而不是null(什么都没有)。 - John Woo
奇怪,我也是这样做的,但我确实插入了空值...也许在绑定值时你可以指定PDO :: PARAM_INT? - Sebas
@JW 请解释一下。我刚刚编辑了原始帖子,以显示仅在INSERT由SELECT提供时才插入一行。 - user1032531
空值,但请查看我先前评论的修改 - Sebas
@Sebas。请看我原帖的最底部。注意,有一个警告,但我目前不知道如何查看该警告。 - user1032531
显示剩余4条评论
3个回答

12

谢谢David,我的错,结果与PDO或PHP无关。我编辑了原帖以显示这一点。对于造成的混淆,我感到抱歉。 - user1032531
@user1032531 更新了这个答案以反映我的进一步理解。 - DavidScherer
我敢打赌你是对的!我从来不知道MySQL的STRICT模式,我会测试一下。谢谢。 - user1032531

8
这种行为在MySQL文档中有详细记录。如果您没有使用严格模式,在将“不正确”的值插入列时(例如,将NULL插入NOT NULL列或将过大的数值插入数字列),MySQL会将该列设置为“最佳可能值”,而不是产生错误。但警告计数会增加。请参阅MySQL文档了解更多信息。

-1

我已经尝试将MySQL的STRICT模式关闭,但并未起作用(我甚至将其更改为"my.ini")。

对我有用的是一个BEFORE INSERT TRIGGER

基本上你需要做:

CREATE TRIGGER triggerName BEFORE INSERT ON customer
FOR EACH ROW
BEGIN
    if new.`customerName` = '' then
    signal sqlstate '45000'
    SET MESSAGE_TEXT = 'Customer Name Cannot be Empty!';
    end if;
END

MESSAGE_TEXT 中,您可以添加任何您希望错误显示的文本。
希望能有所帮助!
其中大部分可以在 这里 找到。

我在帖子开头明确地说:“我已经尝试将MySQL的STRICT模式关闭,但没有起作用。” 我并不是说这是解决方案。 - Pontios
2
你所说的“没用”是什么意思?提问者实际遇到的问题是因为他的STRICT模式被关闭了。那么,既然你需要做的是打开它,为什么要说将其关闭“没用”呢? - jbdeguzman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接