MySQL странное поведение с нулевым целым числом - PullRequest
0 голосов
/ 11 июля 2020

Итак, я пытаюсь реализовать php -etl в своем приложении, а MySQL не позволяет мне вставлять null в целое число, допускающее значение null, но это происходит, если я вручную изменяю его, например:

      ### This works ###

foreach($data as $row){
    if($row["some_integer"] == Null){
         $row["some_integer"] = Null;
    }
    if($row["some_other_integer"] == Null){
         $row["some_other_integer"] = Null;
    }
    MyModel::create($row);
}

     ### This throws General error: 1366 Incorrect integer value ###

foreach($data as $row){
    MyModel::create($row);
}

Пробовал как вручную, так и с пакетом marquine / php -etl. Входными данными является файл csv, null - это пустое место между ;; разделители. Кто-нибудь знает, что здесь происходит? Работаем с laravel 7.

Хорошо, поэтому пакет загружает значения как пустые строки и, установив его в Null, он становится настоящим NULL ... Есть ли способ быстро преобразовать эти значения в NULL?

1 Ответ

0 голосов
/ 11 июля 2020

MySQL не будет рассматривать пустую строку как null просто потому, что пустая строка и null - это разные вещи. Таким образом, сообщение, которое вы получаете от MySQL, не является странным, оно верное.

Обнулить все пустые строки в массиве

Если вы просто хотите обнулить все пустые строки в массиве, вы может создать для него простую функцию:

function nullifyEmptyStrings(array $array)
{
    return array_map(function ($item) { 
        return $item !== '' ? $item : null; 
    }, $array);
}

Затем вызовите ее, когда / когда она вам понадобится:

$row = nullifyEmptyStrings($row);

или используйте ее непосредственно в аргументе для функции create:

MyModel::create(nullifyEmptyStrings($row));

Вот демонстрация

Обнулить спецификацию c пустые строки в массиве

Если вы хотите иметь возможность определять, какой массив элементы для обнуления, вы можете использовать эту функцию:

function nullifyEmptyArrayValues(array $array, array $keys)
{
    foreach ($keys as $key) {
        if (array_key_exists($key, $array) && $array[$key] === '') {
            $array[$key] = null;
        }
    }
    
    return $array;
}

И в своем коде вы сначала передаете массив, содержащий данные, а затем другой массив с ключами для обнуления, если значения пусты:

$row = nullifyEmptyArrayValues($row, ['some-key', 'another-key']);

Вот демонстрация

...