Использование:
MySQL 5.5
ActivePerl v5.14.1
Windows 7 64bit
Следующий скрипт имеет неопределенный $ DBI :: errstr в случае сбоя вызова execute:
#!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:
Запуск SQL через HeidiSQL обеспечивает ожидаемую ошибку внешнего ключа:
(Я не могу вставить изображение, так как я новый пользователь)
Тот же сценарий, запущенный в 32-разрядной Windows XP, обеспечивает ожидаемую ошибку:
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 с некоторым переформатированием:
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 64bit? - но мне неясно / потеряно, как решить или найти правильное место, чтобы сообщить / выяснить окончательно.
Если вы зашли так далеко ... спасибо за чтение!