在我的一个控制器中,我有以下代码:
$sim = 8944502311119819084;
$firstDevice = Device::where( 'sim', $sim )->first();
$sql = "SELECT * FROM devices WHERE sim = ?";
$secondDevice = DB::select($sql, [$sim]);
Log::debug($firstDevice);
Log::debug($secondDevice);
这两个设备都返回了一个sim
数字不匹配的设备,因此好像where()
被忽略了。
怎么可能?此行为有任何已知的解释吗? Eloquent是否可以使用其他数据库连接(我是说99%的人不是,但是我可以完全排除这种连接),还是可以Device
范围受到某种程度的污染?
编辑:
如果我对第一个请求执行DB::getQueryLog()
,则会得到:
array (
0 =>
array (
'query' => 'select * from `devices` where `sim` = ?',
'bindings' =>
array (
0 => 8944502311119819084,
),
'time' => 0.76,
),
)
编辑#2;
好的,从技术上讲,我的初始代码示例显示为$sim = '8944502311119819084';
。在我的 real 情况下,该SIM卡号是通过路线输入的。它以int
的形式出现-改变了世界。如果我将其切换为string
,它将正常工作。因此,现在我将示例转换为int,这实际上打破了这两种情况。
我认为这与PHP中整数的最大值有关,但是我已经验证我在具有64位PHP的64位系统上,该系统的最大整数大小为:9,223,372,036,854,775,807。那比sim卡高:
Sim: 8944502311119819084
Max: 9223372036854775807
还有其他原因导致MySql或某些东西不支持该高整数吗?
答案 0 :(得分:1)
我猜这取决于sim
的存储方式,请看以下内容:
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
考虑帐户的带符号或无符号列(我假设您的列是默认列),您需要将列设为BIGINT
,从而使2^63 -1
为最大整数。
但是实际上where('sim', (string) $sim)