gpt4 book ai didi

mysql - 使用 Rose::DB::Object 和 MySQL 设置 NULL 日期时间

转载 作者:可可西里 更新时间:2023-11-01 08:01:22 25 4
gpt4 key购买 nike

我在这里可能是错的,但看起来这里存在相互冲突的标准。

MySQL 将存储的日期时间“0000-00-00 00:00:00”视为等同于 NULL。(更新 - 似乎只有日期时间定义为 NOT NULL)

但 Rose::DB::Object 对 MySQL DATETIME 字段使用 DateTime,并且尝试从“0000-00-00”设置空 DATETIME 会在 DateTime 模块中引发异常。即,我无法创建具有 0 年、0 月、0 日的 DateTime 对象,因为这会在 DateTime 模块中引发异常。

我检查了 Rose::DB::Object::Metadata::Column::Datetime,但在创建条目或检索时看不到显式处理 NULL DateTime 的方法。

我错过了什么吗?

即,Rose::DB::Object 可以处理 NULL 日期时间 (MySQL) 字段,即使 DateTime(Perl 模块)不能。

示例代码:

#!/usr/bin/perl
use strict;
use warnings;
use lib 'lib';
use RoseDB::dt_test;

my $dt_entry = RoseDB::dt_test->new();
$dt_entry->date_time_field('0000-00-00');
$dt_entry->save;



1;

__END__
# definition of table as stored in DB

mysql> show create table dt_test \G
*************************** 1. row ***************************
Table: dt_test
Create Table: CREATE TABLE `dt_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date_time_field` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

RoseDB::dt_test 模块是:

package RoseDB::dt_test;
use strict;
use warnings;

# this module builds up our DB connection and initializes the connection through:
# __PACKAGE__->register_db
use RoseDB;

use base qw(Rose::DB::Object);

__PACKAGE__->meta->setup (
table => 'dt_test',

columns =>
[
id => { type => 'int', primary_key => 1 },
date_time_field => { type => 'datetime' },
],
);

sub init_db { RoseDB->get_dbh }

1;

当我运行它时,我收到错误“无效的日期时间:'0000-00-00' at tmp.pl line 8”

当我将日期更改为“2010-01-01”时,它按预期工作:

mysql> select * from dt_test\G
*************************** 1. row ***************************
id: 1
date_time_field: 2010-01-01 00:00:00

我终于成功地重新创建了 NULL MySQL 查询示例!

mysql> create table dt_test(dt_test_field datetime not null);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into dt_test values(null);
ERROR 1048 (23000): Column 'dt_test_field' cannot be null
mysql> insert into dt_test values('0000-00-00');
Query OK, 1 row affected (0.00 sec)

mysql> select * from dt_test;
+---------------------+
| dt_test_field |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from dt_test where dt_test_field is null;
+---------------------+
| dt_test_field |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)

看起来像表定义,其中日期时间是用“NOT NULL”定义的,然后尝试使用 MySQL“假空”是问题所在。我现在太累了,不能玩这个,但我会在早上更改表结构时看看会发生什么。

最佳答案

您应该能够将 datetime 列设置为所需的文字 0000-00-00 00:00:00 值并将其保存到数据库中:

$o->mycolumn('0000-00-00 00:00:00');
$o->save;

Rose::DB::Object 不会将此类“全零”值转换为 DateTime 对象,而是保留为文字字符串。没有与 MySQL 的 0000-00-00 00:00:00 日期时间字符串等效的语义 DateTime 对象。

注意:0000-00-00 是一个有效的 date 值,但是 datetime(或 timestamp ) 值必须包括时间:0000-00-00 00:00:00

要将列设置为空,请将 undef 作为列值传递:

$o->mycolumn(undef);

当然,如果数据库中的列定义包含NOT NULL 约束,则save() 将不起作用。

关于mysql - 使用 Rose::DB::Object 和 MySQL 设置 NULL 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2144377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com