2013-03-18 126 views
1
  1. 我在包含JSON字符串的'table_one'(MySQL)中有一个名为'other'的列。从MySQL解析JSON字符串并将INSERT名称/值对解析为MySQL

  2. 该表有数百万条记录。

  3. A.我想遍历'table_one',从'other'和 中读取B.将所有$值插入到表2('table_two')中相应的$ key列中。 foreach $ row(?)

  4. 我已经创建了'table_2'中的列。

  5. 我宁愿没有(我认为)从'table_one'创建一个静态文件(/path/some.json),因为它看起来效率低下,而不是直接从数据库中直接读取。

  6. JSON中的某些值将为空,并且缺少某些键/值对。因此,能够“动态地”获取$ key(s)和$ value(并且如果它们不存在则不会出错)是理想的/关键的。

JSON在“其他”的样本:

{"firstName": "Bob", "lastName": "Jones", "email": "[email protected]", "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很舒服。

回答

0

我不知道标准功能,bt我根据自己的心情以两种方式完成了。

可靠的方法: 写PHP脚本从数据库读取,使用json_decode JSON数据转换为阵,最后写回到DB

快速方法(当我为懒做以适当的方式): 使用定位和键,直到下一个键子后得到的值,类似下面

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

感谢彼得和cjg。 您可否详细说明“可靠的方法?” 我可以连接到数据库,但转换为数组并将其重新加载回来,是我可以使用更多指导的地方。再次感谢! – 2013-03-20 12:20:21

4

迟到问题有点问110天前,但...

查看common_schema,一个MySQL附加库: http://code.google.com/p/common-schema/ 它有一个extract_json_value函数,它使用XPath说明符。注意事项是它不会解析JSON数组(只是将数组值作为空格分隔的字符串返回),并且似乎不喜欢数组中的未加引号的数字值。

是的,common_schema做其他很酷的东西。

更强大的是这个UDF可以解析(合式)JSON字符串: https://github.com/kazuho/mysql_json

在Ubuntu 10.04.4 LTS随便编与MySQL 5.5.29,这是相当快的。注意事项是,当它解析为不是值的东西时,它会返回字符串“object”,并且指定一系列属性键的需要比common_schemas.extract_json_value的XPath说明符更加笨拙。

更新:唉,common_schema是a)关闭了,b)与MySQL 5.7不兼容。 Percona可能会在某个时候更新它,但我不会屏住呼吸。

更新:MySQL 5.7.8+具有原生JSON字段和函数。 JSON函数使用路径,强大且相当快速。使用生成(存储)字段(希望虚拟字段的索引支持)有一些精心设计的索引机会。注意事项(截至5.7.9):MySQL可能会重新排序您的密钥,并丢弃重复密钥的后续值(这与丢弃重复密钥的先前值的许多其他JSON处理程序不同)。