向我指出一个引用,如果将空字符串('')分配给INT NULL字段会发生什么。
它变成NULL还是0?
MySQL的所有版本(从5开始)都是这样吗?
发布于 2018-07-16 19:09:55
这取决于您正在运行的sql_mode。如果模式不是strict,那么插入的值将与对该类型的强制相同,
SELECT CAST('' AS int);
+-----------------+
| CAST('' AS int) |
+-----------------+
| 0 |
+-----------------+
1 row in set, 1 warning (0.00 sec)然而,正如你所看到的,这是精神错乱。
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)所以我们可以告诉MySQL尽量少开玩笑,更像一个真正的数据库,比如PostgreSQL。
SET sql_mode='strict_all_tables';然后,
TRUNCATE foo;
INSERT INTO foo VALUES
(1,1,NULL),
(2,NULL,''),
(3,'',NULL),
(3,NULL,NULL);但这一次,
错误1048 (23000):列'b‘不能为空
有关更多信息,请参见
发布于 2020-05-07 09:28:42
除了先前的回答之外,如果您迁移或使用Amazon,它将获得默认值,并且只能使用以下值中的至少一个进行更改:
ALLOW_INVALID_DATES, ANSI, ANSI_QUOTES, DB2,
ERROR_FOR_DIVISION_BY_ZERO, HIGH_NOT_PRECEDENCE,
IGNORE_BAD_TABLE_OPTIONS, IGNORE_SPACE, MAXDB, MSSQL, MYSQL323,
MYSQL40, NO_AUTO_CREATE_USER, NO_AUTO_VALUE_ON_ZERO,
NO_BACKSLASH_ESCAPES, NO_DIR_IN_CREATE, NO_ENGINE_SUBSTITUTION,
NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS,
NO_UNSIGNED_SUBTRACTION, NO_ZERO_DATE, NO_ZERO_IN_DATE,
ONLY_FULL_GROUP_BY, ORACLE, PAD_CHAR_TO_FULL_LENGTH,
PIPES_AS_CONCAT, POSTGRESQL, REAL_AS_FLOAT,
STRICT_ALL_TABLES, STRICT_TRANS_TABLES, TRADITIONAL也无法插入空设置。
发布于 2021-08-17 09:36:35
通过使用函数NULLIF(_variable_,'')强制该值变为null,我解决了这一问题。
https://dba.stackexchange.com/questions/212358
复制相似问题