Php 无法使用send_long_data将Bigint数据存储到mysql数据库

Php 无法使用send_long_data将Bigint数据存储到mysql数据库,php,mysql,mysqli,Php,Mysql,Mysqli,在我的mysql数据库中,我需要存储非常大的id值。 因此,我将字段的类型设置为bigint(11) 当我尝试从php中准备好的mysqli语句在表中插入值时,所有值都被设置为2147483647,这是mysql中的最高整数值,即使字段的类型是bigint 例如: echo $id; $stmt_insert->bind_param("i", $id); $stmt_insert->execute; if( $stmt_insert === false ) { $Logge

在我的mysql数据库中,我需要存储非常大的id值。 因此,我将字段的类型设置为bigint(11)

当我尝试从php中准备好的mysqli语句在表中插入值时,所有值都被设置为
2147483647
,这是mysql中的最高整数值,即使字段的类型是bigint

例如:

echo $id;
$stmt_insert->bind_param("i", $id);
$stmt_insert->execute;

if( $stmt_insert === false ) {
    $Logger->error( mysqli_error($conn) );
}
让我输出
2300679976
,但在数据库
2147483647
中存储

然后,我阅读了
bind_param
函数的文档,发现要存储大数据,必须使用
send_long_data
函数。因此,我尝试了以下方法:

echo $id;
$stmt_insert->bind_param("b", null);
$stmt_insert->send_long_data(0, $id);
$stmt_insert->execute;

if( $stmt_insert === false ) {
    $Logger->error( mysqli_error($conn) );
}

但这并没有解决问题。即使将表字段设置为bigint,仍会存储
2147483647

由于32位系统上MySQL中的最大int大小为2147483647,因此必须更改数据类型。有几种方法可以解决这个问题

  • 将MySQL数据类型更改为double。(技术上正确的方法) 双精度比整数精度高。因此,处理这个问题的一种方法是在将值2300679976存储到MySQL表之前,将其更改为看起来像2.300679976的双精度值。此方法的缺点是必须向getter/setter添加代码,将值转换为双精度输入和字符串输出。我称之为“技术上正确的方法”,因为它将数据保持为数值。如果要将此数据移动到不同的数据库(如MsSQL或PostgreSQL),它将经得起迁移

  • 将MySQL数据类型更改为Varchar。(简单但不完整的方法) Varchar为您提供空间,使ID的长度达到255个字符。这个方法很简单,因为它不需要在值进出数据库时转换它们。PHP不在乎该值是否是从数据库中输出的字符串,当您在数字情况下使用它时,它会将其强制为数字类型。我称之为“not integris方法”,因为它将数据存储为与代码中使用的类型不同的类型,并利用PHPs动态类型自动进行转换。如果您要将这些数据移动到另一个数据库中,您可能需要在代码中修复一些东西,以使其恢复工作状态,因为在数据类型完整性方面,它们并不太宽松


  • 我刚刚发现问题确实出在mysql数据库中,类型设置不正确

    我确实将其设置为bigint,但意外地将其固定为11,这是正常的int大小


    我删除了固定大小,现在字段被正确设置为bigint(20),值也被正确存储。

    谢谢!更改了它您是否确定
    $id
    包含您认为的功能?请检查
    var\u dump($id)
    。这就是为什么我像我说的那样做了回声,它给了我
    2300679976
    。因此,
    $id
    变量包含正确的值“类型设置不正确的地方。我将其设置为bigint,但意外地使用了固定大小11,这是正常的int大小”-我对此有一种感觉,没有问它设置为什么。在这件事上,我应该按照我的直觉去做。哈哈,很高兴看到你解决了这个问题@JakobAbfalter@JakobAbfalter我觉得你应该发布你自己的答案,而不是编辑,以供将来的访问者使用。我很乐意为它投票。BIGINT只有两种可能的(固定)大小,这取决于它是有符号的还是无符号的。括号中的数字没有任何有用的含义。您可能已经将该列定义为unsigned INT。您可以使用SQL模式来处理它,因此在类似这样的情况下可以获得错误消息,这也毫无价值。