我正在使用的旧系统中的一位前开发人员使用PHP serialize()
将一个数据数组展平为一个MySQL表的一列。
我需要编写一个涉及此列的复杂查询。有没有办法在SQL查询中反序列化数据(即使它是一个逗号分隔的字符串),还是需要将结果传递回PHP?
答案 0 :(得分:1)
序列化的PHP数据只是一个字符串,所以对于"简单"搜索,你可以使用基本的MySQL字符串操作。
e.g。序列化数组有一个name
参数,你需要匹配它,所以
... WHERE LOCATE(CONCAT('s:', LENGTH('foo'), ':foo') ,serializeddatafield) > 0
会产生
WHERE LOCATE('s:3:foo', serializeddata) > 0
但是,这会在数据中的任何位置找到 ANY 字符串,其值为foo
,而不一定在您想要的特定数组字段中。
e.g。你可能最好还是整个领域,在PHP中进行反序列化,然后在那里进行搜索。但是,您可以使用上述技术来最小化您必须抽取/解析的字符串总数。