在我的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
。
答案 0 :(得分:1)
我刚刚发现问题确实存在于mysql数据库中,其中类型设置不正确。
我确实将它设置为bigint,但意外地固定大小为11,这是正常的int大小。
我删除了固定大小,现在字段已正确设置为bigint(20),现在值正确存储。
答案 1 :(得分:0)
由于32位系统上MySQL中的max int size是2147483647,因此您必须更改数据类型。有几种方法可以解决这个问题。
将MySQL数据类型更改为double。 (技术上正确的方法) 双打可以比整数更精确。因此,处理此问题的一种方法是在将值存储在MySQL表中之前将值2300679976更改为看起来像2.300679976的double。使用此方法的问题是,您必须向getter / setter添加代码,将代码转换为double,并输出一个字符串。我称之为技术上正确的方法'因为它将数据维护为数值。如果您要将此数据移动到其他数据库(如MsSQL或PostgreSQL),则可以直接进行迁移。
将MySQL数据类型更改为Varchar。 (简单但不是整合的方法) Varchar为您提供最多255个字符长的ID。这种方法很简单,因为它不需要您在进出数据库时转换值。如果值是一个来自数据库的字符串,PHP并不关心,当你在数字情况下使用它时,它会将它强制转换为数字类型。我将其称为“非整合方法”。因为它将数据存储为与代码中使用的类型不同的类型,并且它利用PHP动态类型来自动进行转换。如果要将此数据移动到其他数据库,则可能需要在代码中修复一些内容才能使其恢复工作状态,因为在数据类型完整性方面它们并不那么宽松。