当我的查询有效但尝试保存provider_id
时,我在数据库中得到一个不同的数字。
字段的类型为INT
。除非我尝试将字段类型更改为VARCHAR
/* prepare query */
$query = 'INSERT INTO `users`(`first_name`,
`last_name`,
`gender`,
`username`,
`profile_picture`,
`provider`,
`provider_id`,
`provider_username`,
`provider_profile`,
`last_login`,
`created_date`,
`ip_address`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW(), INET_ATON(?))';
/* Prepare an insert statement */
$stmt = $mysqli->prepare($query);
if($stmt){
$stmt->bind_param("ssssssisss", $user['first_name'],
$user['last_name'],
$user['gender'],
$user['username'],
$user['link'],
$user['provider'],
$user['id'],
$user['username'],
$user['link'],
$_SERVER['REMOTE_ADDR']);
如果我错了,请纠正我,尽管最好保存为INT
我得到了奇怪的负数:
-502711531
答案 0 :(得分:3)
核心问题是隐式转换期间存在损失范围。
当i
用作mysqli绑定提示时,它有效地(int)value
。在32位系统中,会话ID超过PHP整数的最大大小和溢出:(int)"100007810775829" -> -502711531
。
当使用s
时,mysqli不会执行此转换,而是将值直接传递给MySQL(作为字符串)。在这种情况下,MySQL以静默方式存储字段的maximum value it can,对于INT列为2147483647
。
因此,将s
与 BIGINT字段一起使用" work"这是因为:
但是,我建议使用CHAR类型。这是因为会话ID应该被视为不透明标识符而不是作为数字 - 没有数学运算适用于它。此外,简单地使用CHAR可以避免将来进行静默隐式转换,例如在处理可能错误地将BIGINT转换为整数或浮动PHP值的驱动程序时(因此(如此问题)导致范围或精度的损失)。