如何在MariaDB中对PHP序列化格式列执行带WHERE子句的SELECT查询
问题与解决方案
背景
现有表wp_collection_data,结构及示例数据如下:
| id | collection |
|---|---|
| 1 | a:2:{i:0;i:223406;i:1;i:223447;} |
| 2 | a: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
相关产品推荐
相关产品推荐

