Мой хост перешел на MariaDB с MySQL. Это сценарий Perl CGI.pm. Если я использую use DBI;
и use DBD::MariaDB;
, почти все хорошо переводится в новую базу данных. Но когда я пытаюсь вставить новую строку, ему нужны данные для каждого столбца. Я получаю:
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 на: NOT NULL, NULL/none/как определено и NULL. Это никогда не было проблемой с MySQL, и мне нужно иметь возможность оставлять столбцы пустыми для использования в будущем. Пробовал много вариантов кода. Спасибо за ваши идеи.
Если вы хотите оставить числовой столбец пустым, а затем передать ему значение null или, возможно, 0, а не пустую строку. Вероятно, в вашем экземпляре MySQL был отключен строгий режим sql, что позволяло вашему приложению передавать бессмысленные значения в числовые столбцы.
в вашем экземпляре MySQL не включен sql_mode STRICT_TRANS_TABLES. отключите его в своем экземпляре mariadb или будьте готовы обновить большую часть своего кода. могут быть другие различия sql_mode, которые вызывают другие проблемы; Обычно вам следует попытаться внести изменения в sql_mode намеренно, а не в рамках обновления.
Укажите SHOW CREATE TABLE
и вставляемое значение. (Рассмотрите возможность использования print Date::Dumper($questionmarks);
)
@RickJames, вероятно, проблема в @new_row
Что в $placeholders
, $question_marks
и @new_row
? Все ли они такие, какими должны быть?
Совет: use DBD::MariaDB;
вам не нужен.
Проблема, с которой вы столкнулись, связана с отсутствием null
в MariaDB и MySQL и пустыми строками в столбцах, содержащих 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
и значение по умолчанию отсутствует, вы должны указать значение во время вставки.
Спасибо. То, что я думал, но не то, что хотел. Отличный ответ.
Что мне не хватает? Есть ли что-то, что вы ищете, чего нет в вопросе?
Я просто предполагаю, но я думаю, что @dude имел в виду, что они надеются, что им больше не придется менять код.
Я просто подумал, что проще изменить код.
Спасибо @ivand. Извините, если я неясно выразился, ваш ответ правильный. Просто не хотелось так много работать. Спасибо
ааа, ок, понятно, надеюсь, твой проект пройдет хорошо :)
MariaDB — это форк MySQL. По сути, это один и тот же продукт, и хотя теперь есть различия, они, как правило, не находятся на уровне схемы. Сравните схему MySQL со схемой, используемой в MariaDB. Я ожидаю, что здесь есть некоторые различия.