1

假设数组内容 10 个项目,项目名称 age 作为第二个项目,值为 10 它在序列化后存储在 mysql 数组中

是否可以通过这些步骤直接更新序列化 mysql 查询中的年龄(一种方法可以是这样)从数据库中选择序列化数据取消序列化它更改数组然后再次序列化然后更新

例如像这样序列化数据

a:23:{i:10000011;a:5:{s:15:"social_users_id";s:8:"10000022";s:10:"friends_id";s:8:"10000011";s:8: "relation";s:1:"1";s:6:"status";s:1:"0";s:4:"html";s:41:"Pradeep Kumar 已更新头像。"; }i:10000015;a:5:{s:15:"social_users_id";s:8:"10000022";s:10:"friends_id";s:8:"10000015";s:8:"relation"; s:1:"6";s:6:"status";s:1:"0";s:4:"html";s:41:"Pradeep Kumar 已更新头像。";}i:10000016 ;a:5:{s:15:"social_users_id";s:8:"10000022";s:10:"friends_id";s:8:"10000016";s:8:"relation";s:1: "3";s:6:"状态";s:1:"0";s:4:"html";s:41:"Pradeep Kumar 已更新个人资料图片。";}i:10000018;a:5:

或数组

[10000015] => Array
    (
        [social_users_id] => 10000022
        [friends_id] => 10000015
        [relation] => 6
        [status] => 0
        [html] => Pradeep Kumar has update profile picture.
    )

[10000016] => Array
    (
        [social_users_id] => 10000022
        [friends_id] => 10000016
        [relation] => 3
        [status] => 0
        [html] => Pradeep Kumar has update profile picture.
    )

我想选择和更新数组“10000015”的“状态”索引,我使用了表列的 longtext 数据类型。

我想首先搜索该状态索引,然后在更新之后,我们可以查询还是我必须为此使用 PHP 代码..

可以比这更短吗?如果我们只是想取消更新 1 件事,那里有很多浪费(不必要的查询、更新)......尤其是如果数组很大

加上我们如何在没有反序列化的情况下进行年龄搜索?(可能吗?)

任何想法...谢谢

4

3 回答 3

2

据我所知,这是不可能的,这是在 MySQL 中使用数组的缺点(您需要一直序列化和反序列化数据)。

接下来我看到你的数组看起来一样,所以把它们放在表中。

行 =>social_users_id|friends_id|relation|status|html

如果你想使用数组,你可以看看 NoSQL。我使用mongodb取得了很大的成功。NoSQL 数据库的一个巨大缺点是您需要摆脱 SQL 思维模式。例如,您不能使用 JOINS。

但是在 MonoDB 中,数组是受支持和“可查询的”,这对于动态数据集来说是一个巨大的优势


如果你真的想要它,你可以做一张array桌子array_item

数组如下: id|name

和array_item: id|array_id|key|value

现在你可以在数组项上说我想要数组 id x 的值

但是还有很多其他的东西

就像我想要键 y 和值需要为 x 的数组

请注意,这个数据集会随着时间的推移变得巨大并且难以阅读

于 2013-05-24T07:01:29.423 回答
1

严格来说,当然可以更新数据库的任何行。关键是:这样进行真的是个好主意吗?

不要忘记序列化遵循规则和规范。s:15:"social_users_id"表示unserialize()函数将处理一个 15 个字符的字符串。这是一个例子,还有其他规则。

所以是的,严格来说,你可以更新你的序列化数组中的字符串,但你必须计算规范,因为你真的不想自己重写序列化器,你肯定会,迟早会破坏你的序列化并弄乱你的数据。

无论如何,如果您想了解有关规范的更多详细信息,请查看PHP 手册中的这些注释

还有一点很明显,如果你需要更新一个字段,那么这个字段必须作为一个字段存在,而不是作为一个子字符串存在。那是弱数据库设计,这一点迟早也会给你带来麻烦。

现在,如果你将这两个缺点结合起来,那么......你猜;o)

于 2013-05-24T07:19:49.880 回答
0

简短的回答是否定的,序列化的数据必须反序列化,然后编辑,然后重新序列化,除非你想运行正则表达式函数,比如preg_replace();相当密集的处理。

我的建议是将值单独存储在数据库中。

于 2013-05-24T07:05:48.193 回答