Perl脚本在MariaDB中插入新行报错:整数列无法插入空值
MySQL迁移至MariaDB后Perl DBI插入报错
问题详情
迁移后使用Perl CGI脚本插入数据时出现如下错误:
Software error: DBD::MariaDB::st execute failed: Incorrect integer value: '' for column
mydb.mytable.mycolumnat 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
相关产品推荐
相关产品推荐

