将MySQL和INSERT名称/值对中的JSON字符串解析为MySQL

时间:2013-03-18 16:23:54

标签: php mysql json

  1. 我在'table_one'(MySQL)中有一个名为'other'的列,其中包含一个JSON字符串。

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

  3. 一个。我想迭代'table_one',从'other'读取并且 B.将所有$值插入表2中的相应$ key列('table_two')。 foreach $ row(?)

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

  5. 我宁愿不(我认为)从'table_one'创建一个静态文件(/path/some.json),因为与直接从数据库中直接读取相比,它似乎效率低。

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

  7. 'other'中的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很舒服。

3 个答案:

答案 0 :(得分:4)

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

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

是的,common_schema会做其他很酷的事情。

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

使用MySQL 5.5.29在Ubuntu 10.04.4 LTS上轻松编译,速度非常快。注意事项是当它解析为非值的东西时返回字符串“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处理程序不同)。

答案 1 :(得分:0)

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

可靠的方法: 编写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 )

答案 2 :(得分:0)

mysql_json - 用于解析JSON的MySQL UDF 适用于使用MySQL 5.5的gcc版本4.6.3上的Ubuntu 12.04.5

它有如何安装的说明以及如何使用它的示例: https://github.com/ChrisCinelli/mysql_json