6

我在 mysql 数据库中有一个带有 datetime 列的表。此列的默认值设置为“1900-01-01 00:00:00”。

但是我注意到在插入的 4000 行中,有 1 行将此值设置为“0000-00-00 00:00:00”。尽管设置了默认值,但我对如何发生这种情况感到非常困惑。

这是 MySql 中的已知错误或问题吗?这大约在 4000 行中发生一次。任何人都可以在这里提供任何帮助吗?

4

3 回答 3

6

如果您的表格如下所示:

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)
于 2013-10-08T12:05:10.477 回答
3

TIMESTAMP数据类型用于同时包含日期和时间部分的值。

TIMESTAMP具有'1970-01-01 00:00:01'UTC 到'2038-01-19 03:14:07'UTC 的范围。

官方文件

于 2013-10-08T11:49:05.240 回答
0

MysqlDATETIME字段实际上不能有默认值。改为在查询上使用NOW(),或使用TIMESTAMP可以设置为默认值的数据类型CURRENT_TIMESTAMP()

于 2013-10-08T11:48:30.427 回答