我的主机从 mySQL 迁移到 MariaDB。这是一个 perl cgi.pm 脚本。如果我使用DBI; 和 DBD::MariaDB;大多数内容都可以很好地转换到新数据库。但是当我尝试插入新行时,它需要每列的数据。我得到: 软件错误: DBD::MariaDB::st 执行失败:整数值不正确:'' 位于 myscript.cgi 第 18302 行第 1 行的列
mydb
。mytable
。mycolumn
。
my $dbh = DBI->connect("DBI:MariaDB:database=$database;host=localhost", $MYSQLuserid, $MYSQLpassword, { RaiseError => 1, PrintError => 0 });
my $sth = $dbh->prepare("INSERT INTO mytable ($placeholders) values ($questionmarks)");
$sth->execute(@new_row) or die "Failed to execute statement: " . $sth->errstr;
$new_order_number = $sth->{LAST_INSERT_ID};
$sth->finish() or die $DBI::errstr;
$dbh->disconnect() or die $DBI::errstr;
我尝试将 NULL 修改为:NOT NULL、NULL/none/as Defined 和 NULL。
这对于 mysql 来说从来都不是问题,我需要能够将列留空以供将来使用。
尝试了代码的许多变体。
谢谢你的想法。
null
以及具有
not null
的列中的空字符串有关。我会检查
mytable
中给您带来麻烦的列是否已正确定义。在 MariaDB 中,如果您尝试向其中插入空字符串,则会抛出错误,尤其是对于整数列。您需要调整 Perl 脚本以处理传递空字符串。您可以将该值设置为
undef
(在 SQL 中对应于 NULL)或确保列可以接受空字符串。
use DBI;
use DBD::MariaDB;
my $dbh = DBI->connect("DBI:MariaDB:database=$database;host=localhost", $MYSQLuserid, $MYSQLpassword, { RaiseError => 1, PrintError => 0 });
# Ensure that any empty strings are converted to undef if the column should allow NULLs
my @new_row = map { $_ eq '' ? undef : $_ } @new_row;
my $sth = $dbh->prepare("INSERT INTO mytable ($placeholders) VALUES ($questionmarks)");
$sth->execute(@new_row) or die "Failed to execute statement: " . $sth->errstr;
$new_order_number = $sth->{mysql_insertid}; # Note: Use mysql_insertid to get the last insert id
$sth->finish() or die $DBI::errstr;
$dbh->disconnect() or die $DBI::errstr;
如果列应具有默认值或接受 NULL
,请确保它在数据库模式中以这种方式定义。如果列是
NOT NULL
并且没有默认值,则必须在插入期间提供一个值。