处理MySQL中存储为JSON对象的数据


Dealing with data stored as JSON objects in a MySQL

我使用的是opencart 2.1,客户表上的一个字段是文本数组。数据字段(命名为自定义,键入文本)如下所示:{"2":"2015","1":"2000-11-19"}基本上,第一部分是生日(不允许null),第二部分是今年(允许null)。使用serialize($arr)将其保存到数据库中

我需要一个查询来获得基于"生日"部分的数据。基本上,它是这样的:

SELECT * FROM CUSTOMER WHERE MONTH(custom.1) = MONTH(NOW()) AND DAY(custom.2) = DAY(NOW())

我不知道如何引用自定义字段的第1部分或第2部分。如果我能让查询工作,我可以把它带回php,并使用$arr=unserialize($arr)将它提取到数组中并使用它

此外,稍后,我需要更新自定义字段的第2部分(也称为"今年"部分。它可以为null,也可以为去年,需要更新到今年)。我怎么能做到这一点,同时保持第一部分(又名生日)不变?

有人知道怎么做吗?

谢谢。

解决方案1:

您可以更新到MySQL 5.7,其中现在支持JSON列字段类型。

因此,您的查询将如下所示:

SELECT * FROM CUSTOMER WHERE MONTH(jsn_extract(custom,"$.1")) = MONTH(NOW()) AND DAY(jsn_extract(custom,"$.2")) = DAY(NOW())


解决方案2:

正常查询数据,并使用PHP函数(如JSON Decode+DateTime类)过滤所需的结果。

http://php.net/manual/en/class.datetime.php

http://php.net/manual/en/function.json-decode.php


解决方案3:

您可以使用类似SUBSTRING_INDEX的MySQL函数直接从JSON中提取值。但是,当数据结构发生变化并且不是很安全时,这会导致奇怪的错误。