在 Windows-7-x64 上使用 DBI Perl 和 MySql 的未定义 $DBI::errstr

Posted

技术标签:

【中文标题】在 Windows-7-x64 上使用 DBI Perl 和 MySql 的未定义 $DBI::errstr【英文标题】:Undefined $DBI::errstr using DBI Perl and MySql on Windows-7-x64 【发布时间】:2011-09-15 14:55:26 【问题描述】:

使用:

mysql 5.5 ActivePerl v5.14.1 Windows 7 64 位

以下脚本在执行调用失败时有一个未定义的 $DBI::errstr:

#!c:/perl/bin/perl.exe -w
use DBI;

my $dbh = DBI->connect('dbi:mysql:cq','root','password') or die "Connection Error: $DBI::errstr\n";

# This SQL should fail because of a foreign key constraint
my $sql = "delete from Player where ID=6462"; 

my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";

脚本运行时的输出为:

Use of uninitialized value $DBI::errstr in concatenation (.) or string at testmysql2.pl line 10.
SQL Error:

通过 HeidiSQL 运行的 SQL 提供了预期的外键错误: (我是新用户,无法插入图片)

在 Windows XP 32 位上运行的相同脚本提供了预期的错误:

DBD::mysql::st execute failed: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`)) at testmysql2.pl line 10.
SQL Error2: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`))

注意:

无论使用何种 SQL 都会出现问题,例如 SQL 语法错误也会导致未定义的 $DBI::errstr

有趣的是,返回了一个连接错误——例如,停止 MySQL 服务——运行脚本并按预期给出以下输出:

DBI connect('cq','root',...) failed: Can't connect to MySQL server on 'localhost' (10061) at testmysql2.pl line 4
Connection Error: Can't connect to MySQL server on 'localhost' (10061)

设置跟踪级别没有提供有用的信息(对我来说):

$sth->trace(5, "trace.txt");
$sth->execute or die "SQL Error: $DBI::errstr\n";

带有一个 trace.txt 的 sn-p 并重新格式化为:

dbd_st_free_result_sets
mysql_st_internal_execute MYSQL_VERSION_ID 50147
parse_params statement delete from Player where ID=6462
dbd_st_execute returning imp_sth->row_num 18446744073709551614
execute= ( undef ) [1 items] at testmysql2.pl line 11
DESTROY for DBD::mysql::st (DBI::st=HASH(0x29dc0a8)~INNER) thr#2a97e8

正确的 SQL 按预期运行。我猜这是 Windows 7 64 位的错误? - 但我不清楚/迷失如何解决或找到正确的地方来明确报告/查找。

如果你能走到这一步……感谢阅读!

【问题讨论】:

DBIDBD::mysql 的版本是什么? 【参考方案1】:

添加使用警告,因为 PrintError 默认情况下是打开的,这会导致 DBI 在出现故障时发出警告。此外,尝试将第二个 $DBI::errstr 更改为 $sth->errstr。如果这不起作用,那么我怀疑执行返回失败但 DBD::mysql 内部没有调用 set_err。

【讨论】:

感谢您的反馈 bohica。警告是通过 -w 标志打开的,但我添加了“使用警告” - 结果相同。我试过 $sth->errstr - 是的,同样的结果是一个未定义的字符串。所以它看起来像是 Windows-7-x64 的 DBD::mysql 中的一个错误......关于从这里到哪里的任何建议? 编写一个小型的自包含测试用例并在 rt.cpan.org 上报告或通过dbi.perl.org 将其邮寄给 dbi 用户。我并不是说这是一个错误,但我维护 DBD::ODBC 它工作的地方,例如 perl -le 'use DBI; $h=DBI->connect("dbi:ODBC:x","x","x",RaiseError=>0,PrintError=>0);$s=$h->prepare("select * from does_not_exist");$s->执行或死亡 $s->errstr;'无效的对象名称“does_not_exist”。 (SQL-42S02) [state is 42S02 now 42000] 无法准备语句。 (SQL-42000) 在 -e 第 1 行。 再次感谢 bohica - 我会这样做的。正如他们所说的那样 - onya mate。 是的,值得一票 - 但我没有 >= 15 的声誉,所以我阻止这样做......道歉。 我也会将它发布到 dbi-users 列表(您可以在 dbi.perl.org/support 找到它),因为 DBD::mysql 的 78 rts 看起来好像有积压和某人在 dbi-users 列表上可能会有所帮助。我会自己看,但我不再真正使用 mysql,而且我的学费很短。

以上是关于在 Windows-7-x64 上使用 DBI Perl 和 MySql 的未定义 $DBI::errstr的主要内容,如果未能解决你的问题,请参考以下文章

[原创] 2014.12.02更新网盘链接基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

perl dbi mysql - 值精度

Firebird x Windows 7 x gds32.dll 错误

使用DBI将httpd24连接到Informix的Redhat

在Perl的DBI连接方法中设置keepalive的任何方法

在 Perl DBI 中从 PostgreSQL 捕获 NOTICE