【问题标题】:Cannot get MySQL data which is too large无法获取太大的 MySQL 数据
【发布时间】:2012-02-25 23:03:43
【问题描述】:

我正在建立一个网站,该网站存储特定于每个用户的大型(序列化)数组数组。对大数组进行序列化,然后将数据库更新为其新值。此外,新数组被添加到 $_SESSION[] 数组中,该数组用于用户登录期间。我可以在大数组中使用最多 4 个这样的数组来更新数组,但之后数据不会似乎正确更新。

即使在添加了第三个数组并且 $_SESSION[] 数组似乎包含所有正确的数据之后,MySQL UPDATE 查询也会返回 1,但是当用户注销然后再次登录时,数组似乎不是在用户登录时复制到 $_SESSION[] 数组。如果只有 4 个这样的数组存储在大数组中,则可以从数据库中获取数据没有问题。我将数据库字段的长度增加到超出所需的长度(然后将其增加到超出所需的长度),但没有帮助。

当我转到 phpMyAdmin 时,我可以看到数组已成功更新,直到数组 3 之后序列化数组突然停止(在序列化数组的句子中间),但我认为这可能是 phpMyAdmin 的问题因为在数组编辑框旁边它说“由于它的长度,这个字段可能不可编辑”所以也许 phpMyAdmin 只是不想将数组的其余部分加载到微小的文本区域中。

有什么办法可以解决这个问题吗?有什么我可能不知道的吗(我是 MySQL 的初学者,但到目前为止它似乎一直运行良好)。

用于更新数据库的代码如下:

$_SESSION['data']['user']['templates'][$_SESSION['edit']['templateNo']] = $template;
$serializedTemplates = mysql_real_escape_string(serialize($_SESSION['data']['user']['templates']));
$serializedReports = mysql_real_escape_string(serialize($_SESSION['data']['user']['reports']));
$email = mysql_real_escape_string($_SESSION['data']['user']['details']['email']);
$returned = mysql_query("UPDATE rmusers SET templates='$serializedTemplates', reports='$serializedReports' WHERE email='$email'") or die (mysql_error());

'reports' 和 'email' 数组元素并不真正相关。

用于从数据库中检索数组的代码如下:

$result = mysql_query("SELECT * FROM rmusers WHERE email='" . $_POST['email'] ."'");
$userRow = mysql_fetch_array($result);
if (strlen(unserialize($userRow['templates'])) > 0)
{
    $_SESSION['data']['user']['templates'] = unserialize($userRow['templates']);
}

另外,对不起,我在上述问题中使用了大约 25 次“数组”这个词 :)

【问题讨论】:

  • 数据库中的模板是什么类型的字段?您还应该能够通过查看(而不是编辑)来检查 phpMyAdmin 中的数据,然后单击图标以展开截断的文本字段(如下所示:-> T
  • 与mysql的“max_allowed_pa​​cket”设置相比,这个数据块有多大?
  • 字段类型为文本。我不知道“max_allowed_pa​​cket”设置——这可能是问题所在。我怎样才能改变它?
  • 文本类型有一个maximum length of 65535 字符,也许你打到了?
  • 是的,这正是我拥有的字符数。有什么办法绕过这个限制?

标签: php mysql database arrays


【解决方案1】:

您的字段类型为text,最大长度为 65535 个字符。切换到longtext,理论上限制为 4GB。但是请记住,docs 表示:

LONGTEXT 列的有效最大长度还取决于客户端/服务器协议中配置的最大数据包大小和可用内存。

另请参阅max_allowed_packet 设置的文档:

max_allowed_pa​​cket 的协议限制为 1GB。

【讨论】:

  • “四种文本类型之间没有实际区别”stackoverflow.com/questions/7314682/…
  • 您可能需要考虑LARGEBLOB(或MEDIUMBLOB,~ 16 MB 限制)。 Blob 类型是二进制的,这就是 PHP 中的序列化字符串可以防止进一步的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多