如果您可以控制数据模型,从长远来看,将序列化数据填充到数据库中几乎总是会给您带来麻烦。然而,一个通常无法控制数据模型,例如在使用某些开源内容管理系统时。 Drupal 会在垃圾箱列中粘贴 很多 序列化数据来代替适当的模型。例如,ubercart 的所有订单都有一个“数据”列。贡献的模块需要将数据附加到主订单实体,因此为了方便他们将其附加到序列化的 blob 上。作为第三方,我仍然需要一种方法来获取其中的一些数据以回答一些问题。
a:4:{s:7:"cc_data";s:112:"6"CrIPY2IsMS1?blpMkwRj[XwCosb]gl<Dw_L(,Tq[xE)~(!$C"9Wn]bKYlAnS{[Kv[&Cq$xN-Jkr1qq<z](td]ve+{Xi!G0x:.O-"=yy*2KP0@z";s:7:"cc_txns";a:1:{s:10:"references";a:1:{i:0;a:2:{s:4:"card";s:4:"3092";s:7:"created";i:1296325512;}}}s:13:"recurring_fee";b:1;s:12:"old_order_id";s:2:"25";}
看到那个'old_order_id'了吗?这就是我需要找出这个经常性订单来自哪里的关键,但由于不是每个人都使用经常性订单模块,因此没有合适的位置将其存储在数据库中,因此模块开发人员选择将其填充到垃圾箱表中。
我的解决方案是使用一些有针对性的 SUBSTRING_INDEX 来剔除无关紧要的数据,直到我将结果字符串雕刻成我想要的数据宝石。
然后我添加一个 HAVING 子句来查找所有匹配项,如下所示:
SELECT uo.*,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
SUBSTRING_INDEX( uo.data, 'old_order_id' , -1 ),
'";}', 1),
'"',-1)
AS `old order id`
FROM `uc_orders AS `uo`
HAVING `old order id` = 25
最里面的 SUBSTRING_INDEX 为我提供了 old_order_id 之后的所有内容,而外面的两个则清理了其余部分。
这种复杂的hackery并不是你想要的代码运行多次的东西,它更多的是一种无需编写php脚本就可以从表中获取数据的工具。 p>
请注意,这可以简化为仅
SELECT uo.*,
SUBSTRING_INDEX(
SUBSTRING_INDEX( uo.data, '";}' , 1 ),
'"',-1)
AS `old order id`
FROM `uc_orders` AS `uo`
HAVING `old order id` = 25
但这仅适用于这种特定情况(我想要的值位于数据 blob 的末尾)