Php 为什么在laravel中插入“;0“;而不是",;空";在mysql数据库中?

Php 为什么在laravel中插入“;0“;而不是",;空";在mysql数据库中?,php,laravel,Php,Laravel,为什么我对下面的代码有不同的行为 \DB::table('Test')->insert( array( 'NullableInt' => "NULL", // gives 0 'NullableVarchar' => "NULL" // gives NULL ) ); 我需要解析csv文件来为表种子。fgetcsv将所有内容解析为字符串,对于文本/varchar字段,当字符串工作时为“NULL”,对于整数-非。为什么?当您试图在

为什么我对下面的代码有不同的行为

\DB::table('Test')->insert(
    array(
        'NullableInt' => "NULL", // gives 0
        'NullableVarchar' => "NULL" // gives NULL
    )
);

我需要解析csv文件来为表种子。fgetcsv将所有内容解析为字符串,对于文本/varchar字段,当字符串工作时为“NULL”,对于整数-非。为什么?

当您试图在其中写入“NULL”(字符串)值时,MySQL似乎将text/varchar字段设置为NULL

当您试图将“NULL”字符串直接写入mysql客户端的int字段时,您将得到零。

将字符串插入数字列时,它将自动转换为整数

mysql> SELECT CAST('NULL' AS UNSIGNED INTEGER)
        -> 0

mysql> SELECT CAST(NULL AS UNSIGNED INTEGER)
        -> NULL
更有趣的例子:

mysql> SELECT CAST('1NULL' AS UNSIGNED INTEGER)
        -> 1

mysql> SELECT CAST('NULL1' AS UNSIGNED INTEGER)
        -> 0

mysql> SELECT CAST('1,000' AS UNSIGNED INTEGER)
        -> 1
如果您想要null,您应该执行PHP的
null
DB::raw('null')
(这会阻止Laravel将其视为您提供的字符串):


尝试
null
作为PHP的实际null类型,而不是字符串?事实上,它是一个字符串可能意味着在链中的某个点上,它的强制转换为int,结果是0而不是null。@Wader是的,
null
(非字符串)起作用。我对这种行为感兴趣。这是虫子吗?或者为什么拉威尔会这样做?@avasin和所有非严格类型语言一样,在某种程度上,类型转换成了一种痛苦。在PHP中,当您将字符串强制转换为int时,可能会得到0或至少是PHP试图从字符串中推断出的数字。当您将
“NULL”
强制转换为int时,将得到0.0。但是laravel的开发人员是非常有经验的人,我相信他们已经考虑过了。我只是想知道为什么会这样。顺便说一句,mysql似乎将“NULL”字符串转换为NULL本身。这不是一个bug<代码>“NULL”是字符串,
NULL
不是。
\DB::table('Test')->insert(
    array(
        'NullableInt' => null,
        'NullableVarchar' => DB::raw('NULL'),
    )
);