Php 解析MySQL中的JSON字符串并将名称/值对插入MySQL

Php 解析MySQL中的JSON字符串并将名称/值对插入MySQL,php,mysql,json,Php,Mysql,Json,我在“table_one”MySQL中有一个名为“other”的列,其中包含一个JSON字符串 这个表有数百万条记录 答:我想迭代“table_one”,读取“other”,然后 B.将所有$value插入表2“Table_two”中相应的$key列中。 foreach$行 我已经在“表2”中创建了列 我不想从“table_one”创建一个静态文件/path/some.json,因为与直接从数据库读取相比,它似乎效率低下 JSON中的一些值将为null,并且缺少一些键/值对。因此,能够动态地拾取

我在“table_one”MySQL中有一个名为“other”的列,其中包含一个JSON字符串

这个表有数百万条记录

答:我想迭代“table_one”,读取“other”,然后 B.将所有$value插入表2“Table_two”中相应的$key列中。 foreach$行

我已经在“表2”中创建了列

我不想从“table_one”创建一个静态文件/path/some.json,因为与直接从数据库读取相比,它似乎效率低下

JSON中的一些值将为null,并且缺少一些键/值对。因此,能够动态地拾取$key和$value,并且在它们不存在时不会出错,这是理想的/关键的

“其他”中的JSON示例:

{"firstName": "Bob", "lastName": "Jones", "email": "bob.jones@yahoo.com", "address": "7206 maplehurst drive", "city": "PORT RICHEY", "state": "FL", "zip": "34668", "ipAddress": "208.54.85.233", "gender": "M", "employer_name": "bobs auto", "months_address": "2", "years_address": "12"} 我想现在应该有标准的功能来解决这个问题了。如果有,我再次道歉

目前,我正在使用ETL工具执行一个简单但异常的修剪/分割/映射过程。每个JSON字符串有45对。表结构中的任何细微调整都需要重新映射整个内容


*熟悉PHP、MySQL、JavaScript和jQuery。

我不了解标准函数,但根据我的心情,我采用了两种方法

可靠方法: 编写一个PHP脚本从DB读取,使用json_decode将json数据转换为数组,最后写回DB

快速方法当我懒惰时,以适当的方式: 使用locate和substring获取键后的值,直到下一个键,如下所示

substring(task_time_breakup, locate('","key1":"', task_time_breakup)+7, locate('""}',task_time_breakup)-locate('","key1":"', task_time_breakup)-7 )

我不知道标准功能,但根据我的心情,我有两种方法

可靠方法: 编写一个PHP脚本从DB读取,使用json_decode将json数据转换为数组,最后写回DB

快速方法当我懒惰时,以适当的方式: 使用locate和substring获取键后的值,直到下一个键,如下所示

substring(task_time_breakup, locate('","key1":"', task_time_breakup)+7, locate('""}',task_time_breakup)-locate('","key1":"', task_time_breakup)-7 )

110天前提出的问题有点晚了,但是

看看common_schema,一个MySQL附加库: 它有一个使用XPath说明符的extract_json_value函数。需要注意的是,它不会解析JSON数组,只会将数组值作为空格分隔的字符串返回,并且似乎不喜欢数组中的无引号数字值

是的,common_schema做了其他很酷的事情

更健壮的是这个UDF,它可以解析格式良好的JSON字符串:

使用MySQL 5.5.29在Ubuntu10.04.4LTS上轻松编译,速度非常快。需要注意的是,当它解析为非值的对象时,它会返回字符串对象,并且需要指定一系列属性键比普通的模式更麻烦

更新:唉,common_模式是封闭的,与MySQL 5.7不兼容。Percona可能会在某个时候更新它,但我不会屏住呼吸


更新:MySQL 5.7.8+具有本机JSON字段和函数。JSON函数使用路径,健壮且速度相当快。有一个使用生成的存储字段进行索引的机会,希望对虚拟字段提供索引支持。从5.7.9开始的警告:MySQL可能会对您的密钥重新排序,并且重复密钥的后续值会被丢弃。这与许多其他JSON处理程序不同,这些JSON处理程序会丢弃重复密钥的先前值。

对于110天前提出的问题来说有点晚了,但是

看看common_schema,一个MySQL附加库: 它有一个使用XPath说明符的extract_json_value函数。需要注意的是,它不会解析JSON数组,只会将数组值作为空格分隔的字符串返回,并且似乎不喜欢数组中的无引号数字值

是的,common_schema做了其他很酷的事情

更健壮的是这个UDF,它可以解析格式良好的JSON字符串:

使用MySQL 5.5.29在Ubuntu10.04.4LTS上轻松编译,速度非常快。需要注意的是,当它解析为非值的对象时,它会返回字符串对象,并且需要指定一系列属性键比普通的模式更麻烦

更新:唉,common_模式是封闭的,与MySQL 5.7不兼容。Percona可能会在某个时候更新它,但我不会屏住呼吸


更新:MySQL 5.7.8+具有本机JSON字段和函数。JSON函数使用路径,健壮且速度相当快。有一个使用生成的存储字段进行索引的机会,希望对虚拟字段提供索引支持。从5.7.9开始的注意事项:MySQL可能会对您的密钥重新排序,重复密钥的后续值将被丢弃。这与许多其他JSON处理程序不同,这些JSON处理程序会丢弃重复密钥的先前值。

MySQL\U JSON-用于解析JSON的MySQL UDF 使用MySQL 5.5在gcc版本4.6.3上的Ubuntu12.04.5上运行

它包含如何安装的说明和如何使用的示例:

mysql\u json-用于解析json的mysql UDF 使用MySQL 5在gcc版本4.6.3的Ubuntu 12.04.5上运行。 五,

它包含如何安装的说明和如何使用的示例:

谢谢Peter和cjg。你能详细说明一下可靠的方法吗?我可以连接到数据库,但是转换成一个数组并将其加载回去,这是我可以使用更多指导的地方。再次感谢!谢谢Peter和cjg。你能详细说明一下可靠的方法吗?我可以连接到数据库,但是转换成一个数组并将其加载回去,这是我可以使用更多指导的地方。再次感谢!