【发布时间】:2020-03-08 02:33:34
【问题描述】:
我在 Laravel 中创建了一个带有标准日期时间列的表:
Schema::create('lists', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('ref');
$table->string('provider');
$table->timestamps();
$table->softDeletes();
$table->unique(['provider', 'ref']);
});
当我尝试用 Eloquent 创建一个简单的记录时:
List::updateOrCreate([
'provider' => 'test',
'ref' => 'S4d3g'
], [
'name' => 'Plan'
]);
我收到此消息(这是原始控制台输出,因此请忽略缺少引号):
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2020-03-08 02:25:07' for column 'updated_at' at row 1 (SQL: insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values (test, S4d3g, Plan, 2020-03-08 02:25:07, 2020-03-08 02:25:07))
在数据库上手动运行查询作为原始 SQL 也不起作用:
insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 02:25:07', '2020-03-08 02:25:07')
我使用的是 MySQL 5.7。
莫名其妙地,如果我将日期更改为凌晨 2 点以外的任何时间,它都会起作用:
insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 01:25:07', '2020-03-08 01:25:07')
insert into `lists` (`provider`, `ref`, `name`, `updated_at`, `created_at`) values ('test', 'S4d3g', 'Plan', '2020-03-08 03:25:07', '2020-03-08 03:25:07')
什么可能导致这种奇怪的 MySQL 级别不喜欢时间戳上的凌晨 2 点?
【问题讨论】:
-
这不是一个可重现的问题,对于 MySQL 来说,凌晨 2 点并没有什么特别之处。
-
我愿意相信这一点。我一生中从未见过这种情况发生,但我可以看到它发生。我什至可以录制一个运行 SQL raw 的屏幕共享来演示。
-
只是一个预感:在你的国家,夏令时可能从今天开始,时钟从凌晨 1:59 到凌晨 3:00?这可以解释错误,因为那天凌晨 2 点根本不存在。
-
@CherryDT 这是我可以解释的唯一方法,而不是假设我在暮光区的一集中。夏令时(也是荒谬的)在我们身上。
-
这是使用使用本地时区的
DATETIME的恼人后果。 (出于这个原因,我更喜欢TIMESTAMP。)另外,想想 DST 结束时会发生什么 - 有 两个 2am-s,但在 SQL 中你无法区分 2A:00 和 2B:00,做好准备吧!
标签: mysql laravel laravel-6.2