Рассмотрим простую таблицу mysql со столбцами id
(целое число) и flag
(логическое значение).
Пользовательский интерфейс, написанный на JavaScript, взаимодействует с бэкэндом CGI через JSON как для получения данных из таблицы, так и для их обновления.
Теперь при отправке данных {id: 5, flag: true}
на сервер я, конечно, использую from_json
, чтобы получить хеш perl (ref). Тогда
my $sth = $dbh->prepare('UPDATE my_table SET flag = ? WHERE id = ?);
$sth->execute($data->{flag}, $data->{id});
всегда приводит к вставке ложного значения. Я полагаю, что это происходит из-за магического поведения JSON :: true и JSON :: false, которые преобразуются в 'true' и 'false', соответственно (но нумеруются до 1 и 0). По-видимому, оператор execute обеспечивает строковый контекст, а не числовой контекст, поэтому сервер MySQL получает строку, не содержащую чисел, что затем приводит к вставке значения 0. Сейчас я исправляю это, поставив ? 1 : 0
после $data->{flag}
.
В другом направлении происходит обратное: согласно документу DBI «Большинство данных возвращается в скрипт Perl в виде строк.», Поэтому, когда я нажимаю на результат запроса SELECT с помощью to_json
, значения принимаются пользовательским интерфейсом в виде строк JavaScript «0» и «1», которые являются истинными в JavaScript. Так что сейчас я делаю $_->{flag} += 0 foreach (@result)
перед применением to_json
.
Вопрос: В какой точке цепи я должен вставить эти «хаки»? В конце JavaScript я мог, например, убедиться, что вместо значений true и false были отправлены значения 1 и 0, а флаги перечитаны как числа. Есть ли что-то, что я могу сказать DBI, чтобы он возвращал числовые столбцы как (скаляры, которые JSON будет рассматривать как) числа?