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

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

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

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

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

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

“其他”中的 JSON 示例:

{“firstName”:“Bob”,“lastName”:“Jones”,“email”:“bob.jones@yahoo.com”,“address”:“7206 maplehurst drive”,“city”:“PORT RICHEY”, “州”:“FL”,“zip”:“34668”,“ipAddress”:“208.54.85.233”,“性别”:“M”,“employer_name”:“bobs auto”,“months_address”:“2” , "years_address": "12"}

你会(我会)认为现在会有标准功能来解决这个问题。如果有,我再次道歉。

目前,我正在使用 ETL 工具来执行一个简单但极其复杂的修剪/拆分/映射过程。每个 JSON 字符串有 45 对。表结构的任何细微调整都需要重新映射整个事物。

*适用于 PHP、MySQL、JavaScript、jQuery。

4

3 回答 3

4

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

查看 common_schema,一个 MySQL 附加库: 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 处理程序不同)。

于 2013-07-06T15:27:32.420 回答
0

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

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

于 2015-03-19T05:10:51.203 回答
0

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

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

快速方法(当我懒惰以适当的方式做时): 使用定位和子字符串获取键之后的值直到下一个键,如下所示

substring(task_time_breakup, locate('","key1":"', task_time_breakup)+7, locate('""}',task_time_breakup)-locate('","key1":"', task_time_breakup)-7 )
于 2013-03-18T17:02:17.560 回答