我在 mysql 数据库中有一个带有 datetime 列的表。此列的默认值设置为“1900-01-01 00:00:00”。
但是我注意到在插入的 4000 行中,有 1 行将此值设置为“0000-00-00 00:00:00”。尽管设置了默认值,但我对如何发生这种情况感到非常困惑。
这是 MySql 中的已知错误或问题吗?这大约在 4000 行中发生一次。任何人都可以在这里提供任何帮助吗?
如果您的表格如下所示:
create table foo (
name VARCHAR(50),
dob DATETIME DEFAULT '1900-01-01 00:00:00'
);
...它应该工作得很好。
您应该注意,默认值并不意味着强制。您仍然可以插入不同的值或根据自己的喜好更新行:
insert into foo (name) values ('Jim'), ('Joe'), ('Jack');
insert into foo (name, dob) values ('Jill', '1999-12-31 23:59:59');
update foo set dob = current_timestamp where name='Jack';
大概就是这么回事。
由于值为0000-00-00 00:00:00
,因此 MySQL 提供了已知的错误/功能。根据您的 SQL 模式,您可以存储无效或不完整的日期。
编辑:为避免插入0000-00-00
日期,您需要强化 SQL 模式:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE foo SET dob='invalid' WHERE name='Jim';
Query OK, 1 row affected, 1 warning (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE foo SET dob='invalid' WHERE name='Joe';
ERROR 1292 (22007): Incorrect datetime value: 'invalid' for column 'dob' at row 2
mysql>
mysql> SELECT * FROM foo;
+------+---------------------+
| name | dob |
+------+---------------------+
| Jim | 0000-00-00 00:00:00 |
| Joe | 1900-01-01 00:00:00 |
| Jack | 1900-01-01 00:00:00 |
+------+---------------------+
3 rows in set (0.00 sec)
TIMESTAMP
数据类型用于同时包含日期和时间部分的值。
TIMESTAMP
具有'1970-01-01 00:00:01'
UTC 到'2038-01-19 03:14:07'
UTC 的范围。
MysqlDATETIME
字段实际上不能有默认值。改为在查询上使用NOW()
,或使用TIMESTAMP
可以设置为默认值的数据类型CURRENT_TIMESTAMP()
。