将空字符串分配给 MySQL 中的 INT NULL 字段

por*_*ton 4 mysql datatypes type-conversion

给我一个参考,如果将空字符串 ( '') 分配给一个INT NULL字段会发生什么。

它变成NULL0吗?

MySQL的所有版本(从5开始)都做同样的事情吗?

Eva*_*oll 5

这取决于sql_mode您正在运行的身份。如果模式不是,strict那么您将获得插入的值与对该类型的强制相同,

SELECT CAST('' AS int);
+-----------------+
| CAST('' AS int) |
+-----------------+
|               0 |
+-----------------+
1 row in set, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

然而,这是疯狂的,正如你所看到的..

CREATE TABLE foo ( id int, a int, b int NOT NULL );

INSERT INTO foo VALUES
  (1,1,NULL),
  (2,NULL,''),
  (3,'',NULL),
  (4,NULL,NULL);

SELECT * FROM foo;
+------+------+---+
| id   | a    | b |
+------+------+---+
|    1 |    1 | 0 |
|    2 | NULL | 0 |
|    3 |    0 | 0 |
|    4 | NULL | 0 |
+------+------+---+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

所以我们可以告诉 MySQL 尽量不要开玩笑,更像一个真正的数据库,比如 PostgreSQL

SET sql_mode='strict_all_tables';
Run Code Online (Sandbox Code Playgroud)

进而,

TRUNCATE foo;

INSERT INTO foo VALUES
  (1,1,NULL),
  (2,NULL,''),
  (3,'',NULL),
  (3,NULL,NULL);
Run Code Online (Sandbox Code Playgroud)

但这一次我们得到,

错误 1048 (23000):列 'b' 不能为空

有关更多信息,请参阅,