MySQL具有null整数的怪异行为



所以我试图在我的应用程序中实现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?

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));

这是的演示

将数组中特定的空字符串置空

如果你想定义哪些数组项要作废,你可以使用这个函数:

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']);

这是的演示

相关内容

最新更新