You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MariaDB中对PHP序列化格式列执行带WHERE子句的SELECT查询

问题与解决方案

背景

现有表wp_collection_data,结构及示例数据如下:

idcollection
1a:2:{i:0;i:223406;i:1;i:223447;}
2a:4:{i:0;i:213513;i:1;i:58168;i:2;i:247337;i:3;i:235073;}

其中collection列存储PHP序列化的整数数组,尝试用MariaDB JSON函数查询包含特定整数的记录时,因数据非JSON格式报错:Warning: #4038 Syntax error in JSON text in argument 1 to function 'json_contains' at position 1。

问题解答

1. 能否用MariaDB JSON函数实现查询?

不能直接使用JSON函数,但如果你的MariaDB版本是10.6及以上,可以借助UNSERIALIZE()函数先将PHP序列化数据转换为可被JSON函数处理的格式,再进行查询:

查询单个值(如223447)

SELECT *
FROM `wp_collection_data`
WHERE JSON_CONTAINS(UNSERIALIZE(`collection`), '[223447]');

查询多个值(如223447或235073)

SELECT *
FROM `wp_collection_data`
WHERE JSON_OVERLAPS(UNSERIALIZE(`collection`), '[223447, 235073]');

UNSERIALIZE()是MariaDB专门为解析PHP序列化数据提供的函数,转换后的数据可直接兼容JSON相关操作,结果更准确可靠。

2. 是否可以通过查找":"和";"之间的整数实现查询?

可以,利用PHP序列化数组的格式特征(每个数值都以i:数值;的形式存在),通过字符串匹配实现查询,兼容所有MariaDB版本:

查询单个值(如223447)

SELECT *
FROM `wp_collection_data`
WHERE `collection` LIKE '%;i:223447;%';

查询多个值(如223447或235073)

SELECT *
FROM `wp_collection_data`
WHERE `collection` LIKE '%;i:223447;%'
   OR `collection` LIKE '%;i:235073;%';

这种方式通过%;i:数值;%的匹配规则,确保只命中数组中的数值部分,避免误匹配索引或其他无关数字(只要你的数值不会和数组索引重复,就不会有问题)。


内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:08:24