Как вставить новую строку Mariadb Perl

Мой хост перешел на 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, и мне нужно иметь возможность оставлять столбцы пустыми для использования в будущем. Пробовал много вариантов кода. Спасибо за ваши идеи.

MariaDB — это форк MySQL. По сути, это один и тот же продукт, и хотя теперь есть различия, они, как правило, не находятся на уровне схемы. Сравните схему MySQL со схемой, используемой в MariaDB. Я ожидаю, что здесь есть некоторые различия.

Tangentially Perpendicular 27.08.2024 03:57

Если вы хотите оставить числовой столбец пустым, а затем передать ему значение null или, возможно, 0, а не пустую строку. Вероятно, в вашем экземпляре MySQL был отключен строгий режим sql, что позволяло вашему приложению передавать бессмысленные значения в числовые столбцы.

Shadow 27.08.2024 04:23

в вашем экземпляре MySQL не включен sql_mode STRICT_TRANS_TABLES. отключите его в своем экземпляре mariadb или будьте готовы обновить большую часть своего кода. могут быть другие различия sql_mode, которые вызывают другие проблемы; Обычно вам следует попытаться внести изменения в sql_mode намеренно, а не в рамках обновления.

ysth 27.08.2024 04:44

Укажите SHOW CREATE TABLE и вставляемое значение. (Рассмотрите возможность использования print Date::Dumper($questionmarks);)

Rick James 27.08.2024 04:53

@RickJames, вероятно, проблема в @new_row

ysth 27.08.2024 05:03

Что в $placeholders, $question_marks и @new_row? Все ли они такие, какими должны быть?

brian d foy 27.08.2024 12:00

Совет: use DBD::MariaDB; вам не нужен.

ikegami 27.08.2024 18:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, с которой вы столкнулись, связана с отсутствием 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 27.08.2024 04:13

Что мне не хватает? Есть ли что-то, что вы ищете, чего нет в вопросе?

lvand 27.08.2024 04:23

Я просто предполагаю, но я думаю, что @dude имел в виду, что они надеются, что им больше не придется менять код.

ikegami 27.08.2024 18:13

Я просто подумал, что проще изменить код.

lvand 28.08.2024 03:06

Спасибо @ivand. Извините, если я неясно выразился, ваш ответ правильный. Просто не хотелось так много работать. Спасибо

dude 28.08.2024 04:27

ааа, ок, понятно, надеюсь, твой проект пройдет хорошо :)

lvand 28.08.2024 04:28

Другие вопросы по теме