如何将int类型转换为array类型 实现数据库序列化值的精准查询
序列化数组字段的数值查询解决方案
你遇到的核心问题是数据库中存储的a:1:{i:0;i:30;}是PHP序列化后的数组格式字符串,并非数据库原生数组类型,所以直接用int值30匹配整段字符串无法得到结果,可根据场景选择以下方案:
- 临时兼容方案(不改动现有存储逻辑)
PHP序列化存储int值的格式固定,可通过带特殊标识符的模糊查询匹配,SQL语句如下:
前后包裹的SELECT * FROM product WHERE price LIKE '%"i:30;"%'i:和;可避免匹配到301、130这类包含30的数值,降低误判概率。 - 长期优化方案(推荐)
序列化字符串存储数组不符合数据库设计范式,无法走索引,查询效率极低,建议调整存储逻辑:- 若使用MySQL 5.7及以上版本,将字段改为JSON类型存储数组,可直接调用原生JSON函数查询:
SELECT * FROM product WHERE JSON_CONTAINS(price, '30', '$') - 额外新增关联表存储price的多值数据,和product表主键关联,后续多条件查询、索引优化的灵活度最高。
- 若使用MySQL 5.7及以上版本,将字段改为JSON类型存储数组,可直接调用原生JSON函数查询:
- 小数据量适配方案
若数据量极小,可先查询出符合其他筛选条件的全量product数据,在业务代码中反序列化price字段为数组后,再判断30是否存在于数组中,不适合数据量超过千级的场景。
内容的提问来源于stack exchange,提问作者Debutant
相关产品推荐
相关产品推荐

