【发布时间】:2019-09-02 10:13:38
【问题描述】:
我在 MySQL 5.5 的表列中存储了 JSON 关联数组数据。我想在 JSON 中搜索一个带有键和值的特定数组键 我的 JSON 结构:
{
"Interface_1":{
"Caption":"[00000004] Intel(R) Dual Band Wireless-AC 3160",
"MACAddress":"D0:7E:35:D3:C1:52",
"DHCPServer":"192.168.1.1",
"IPAddress":"192.168.1.101",
"DNSServerSearchOrder":[
"8.8.8.8",
"9.9.9.9"
],
"DefaultIPGateway":"192.168.1.1",
"IPSubnet":"255.255.255.0"
},
"Interface_2":{
"Caption":"[00000011] VMware Virtual Ethernet Adapter for VMnet1",
"MACAddress":"00:50:56:C0:00:01",
"IPAddress":[
"192.168.29.1",
"fe80::d9f4:2bfa:59f:b9ba"
],
"IPSubnet":[
"255.255.255.0",
"64"
]
},
"Interface_3":{
"Caption":"[00000013] VMware Virtual Ethernet Adapter for VMnet8",
"MACAddress":"00:50:56:C0:00:08",
"IPAddress":[
"192.168.71.1",
"fe80::acec:db96:af3a:4680"
],
"IPSubnet":[
"255.255.255.0",
"64"
]
}
}
所以对于键值搜索,我有这个查询:
SELECT * FROM `extable`
WHERE network RLIKE '"MACAddress":"[[:<:]]00:50:56:C0:00:08[[:>:]]"'
它工作正常,但我的问题是我无法选择 Interface_1 并在其上搜索 MACAddress。
我想选择Interface_1并在上面搜索MACAddress。
【问题讨论】:
-
一般说明:此数据库设计不是最佳的。如果您想出了它并且可以影响设计,请将其从存储无格式 JSON blob 更改为适当规范化的布局(拆分为表
interface、ip_address、ip_subnet与外键关系)。 -
更具体的说明:您永远不想在 JSON 上运行正则表达式(或 any 字符串函数)。 MySQL 有原生 JSON 函数,使用它们。 (虽然不是 5.5 - 你可能想升级,那个版本现在已经九年多了。)