You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl脚本在MariaDB中插入新行报错:整数列无法插入空值

MySQL迁移至MariaDB后Perl DBI插入报错

问题详情

迁移后使用Perl CGI脚本插入数据时出现如下错误:

Software error: DBD::MariaDB::st execute failed: Incorrect integer value: '' for column mydb.mytable.mycolumn at row 1 at myscript.cgi line 18302.

对应核心代码:

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属性、调整代码写法均无效,此前MySQL环境下无此问题,需保留列空值以便后续使用。

解决思路

  • 修正传入参数类型:报错根源是给整数列mycolumn传递了空字符串'',MariaDB默认SQL_MODE更严格(包含STRICT_TRANS_TABLES),会拒绝类型不匹配的插入。检查@new_row中对应mycolumn的元素,将空字符串替换为undef,DBI会自动把undef转换成SQL标准的NULL,既满足空值需求,又符合类型要求。
  • 临时调整SQL_MODE(谨慎使用):若暂时无法修改代码,可在数据库连接时设置宽松模式,比如修改DSN为"DBI:MariaDB:database=$database;host=localhost;sql_mode=''",或连接后执行$dbh->do("SET sql_mode = ''")。但此方法会降低数据校验严谨性,仅作临时过渡方案。
  • 确认列属性配置:确保mycolumn列允许NULL(若需要空值),且未设置非NULL的默认值;数据库整数列的空状态标准写法是NULL,而非空字符串。
  • 升级DBD::MariaDB模块:旧版本的DBD::MariaDB可能存在类型映射bug,升级到最新稳定版,优化对MariaDB类型的处理逻辑。

内容的提问来源于stack exchange,提问作者dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:04:58