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

时间:2016-02-20 14:55:10

标签: php mysql mysqli

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

当我尝试在php中准备好的mysqli语句中插入表中的值时,所有值都设置为2147483647,这是mysql中最高的Integer值,即使字段的类型是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

2 个答案:

答案 0 :(得分:1)

我刚刚发现问题确实存在于mysql数据库中,其中类型设置不正确。

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

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

答案 1 :(得分:0)

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

  1. 将MySQL数据类型更改为double。 (技术上正确的方法) 双打可以比整数更精确。因此,处理此问题的一种方法是在将值存储在MySQL表中之前将值2300679976更改为看起来像2.300679976的double。使用此方法的问题是,您必须向getter / setter添加代码,将代码转换为double,并输出一个字符串。我称之为技术上正确的方法'因为它将数据维护为数值。如果您要将此数据移动到其他数据库(如MsSQL或PostgreSQL),则可以直接进行迁移。

  2. 将MySQL数据类型更改为Varchar。 (简单但不是整合的方法) Varchar为您提供最多255个字符长的ID。这种方法很简单,因为它不需要您在进出数据库时转换值。如果值是一个来自数据库的字符串,PHP并不关心,当你在数字情况下使用它时,它会将它强制转换为数字类型。我将其称为“非整合方法”。因为它将数据存储为与代码中使用的类型不同的类型,并且它利用PHP动态类型来自动进行转换。如果要将此数据移动到其他数据库,则可能需要在代码中修复一些内容才能使其恢复工作状态,因为在数据类型完整性方面它们并不那么宽松。