我在mysql数据库中有一个包含datetime列的表。此列的默认值设置为'1900-01-01 00:00:00‘。
然而,我注意到,在插入的4000行中,有1行将此值设置为'0000-00-00 00:00:00‘。我非常困惑,尽管设置了默认值,但怎么会发生这种情况。
这是MySql中已知的错误或问题吗?这种情况大约每4000行发生一次。这里有人能提供帮助吗?
发布于 2013-10-08 20:05:10
如果您的表如下所示:
create table foo (
name VARCHAR(50),
dob DATETIME DEFAULT '1900-01-01 00:00:00'
);
..。它应该是work just fine。
您应该注意到,默认值并不意味着强制。您仍然可以根据自己的喜好插入不同的值或更新行:
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模式,您可以存储无效或不完整的日期。
SQL:为避免插入日期,您需要强化0000-00-00
模式:
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-08 19:49:05
TIMESTAMP
数据类型用于同时包含日期和时间部分的值。
TIMESTAMP
的范围从'1970-01-01 00:00:01'
协调时到'2038-01-19 03:14:07'
协调时。
发布于 2013-10-08 19:48:30
Mysql DATETIME
字段实际上不能有默认值。改为对查询使用NOW()
,或者使用TIMESTAMP
数据类型,该数据类型可以默认设置为CURRENT_TIMESTAMP()
。
https://stackoverflow.com/questions/19246881
复制相似问题