Результаты Perl fetchrow_hashref отличаются от целочисленных и строковых значений - PullRequest
1 голос
/ 10 октября 2019

Мне очень нужна ваша помощь для понимания следующего примера кода на Perl:

#!/usr/bin/perl

# Hashtest

use strict;
use DBI;
use DBIx::Log4perl;
use Data::Dumper;
use utf8;

if (my $dbh = DBIx::Log4perl->connect("DBI:mysql:myDB","myUser","myPassword",{
            RaiseError => 1,
            PrintError => 1,
            AutoCommit => 0,
            mysql_enable_utf8 => 1
        }))
{

    my $data = undef;
    my $sql_query = <<EndOfSQL;
SELECT  1
EndOfSQL
    my $out = $dbh->prepare($sql_query);
    $out->execute() or exit(0);
    my $row = $out->fetchrow_hashref();
    $out->finish();

    # Debugging
    print Dumper($row);

    $dbh->disconnect;
    exit(0);
}

1;

Если я запускаю этот код на двух машинах, я получаю разные результаты.

Результат на машине 1:(Результат мне нужен с целочисленным значением)

arties@p51s:~$ perl hashTest.pl 
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
          '1' => 1
        };

Результат на машине 2: (Результат, который создает проблемы из-за строкового значения)

arties@core3:~$ perl hashTest.pl
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
          '1' => '1'
        };

Как вы видите на машине 1 значениеиз MySQL будет интерпретироваться как целочисленное значение, а на компьютере 2 - как строковое значение. Мне нужно на обеих машинах целочисленное значение. И невозможно изменить хэш позже, потому что исходный код имеет слишком много значений, которые должны быть изменены ...

Обе машины используют DBI 1.642 и DBIx :: Log4perl 0.26

Единственное отличие заключается в том, что версия 1 для компьютера Perl (v5.26.1) отличается от машины 2 (v5.14.2)

Поэтому большой вопрос заключается в том, как я могу убедиться, что всегда получаю целое число в хэше какрезультат?

Обновление 10.10.2019:

Чтобы показать, возможно, лучшую проблему, я улучшаю приведенный выше пример:

...
use Data::Dumper;
use JSON;  # <-- Inserted
use utf8;
...

...
print Dumper($row);

# JSON Output
print JSON::to_json($row)."\n"; # <-- Inserted

$dbh->disconnect;
...

Теперь выводна машине 1 с последней строкой вывод JSON:

arties@p51s:~$ perl hashTest.pl 
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
          '1' => 1
        };
{"1":1}

Теперь вывод на машине 2 с последней строкой вывод JSON:

arties@core3:~$ perl hashTest.pl
$VAR1 = {
          '1' => '1'
        };
{"1":"1"}

Вы видите, что оба Data :: DumperИ JSON имеет такое же поведение. И, как я написал в bevor, +0 не вариант, потому что оригинальный хеш намного сложнее.

Обе машины используют JSON 4.02

1 Ответ

2 голосов
/ 10 октября 2019

@ Ник П: Это решение, которое вы связали Почему DBI неявно заменяет целые числа на строки? , DBD :: mysql был разным в обеих системах! Поэтому я обновил на машине 2 с версии 4.020 до версии 4.050, и теперь обе системы имеют одинаковый результат! А целые числа являются целыми числами; -)

Итак, результат на обеих машинах теперь такой:

$VAR1 = {
          '1' => 1
        };
{"1":1}

Спасибо!

...