mysql没有返回正确的json

Posted

技术标签:

【中文标题】mysql没有返回正确的json【英文标题】:mysql doesnt return proper json 【发布时间】:2018-08-04 00:10:26 【问题描述】:

我使用 mysql 5.7

我想将连接表中的结果连接到单列中。我使用包装在GROUP_CONCAT 函数中的JSON_OBJECT 函数。这是查询

SELECT r.id, r.name,
GROUP_CONCAT(
    JSON_OBJECT(
       'id', i.id, 'name', i.name, 'metrics', i.metrics, 'amount', ir.amount,
                  'cat_id', i.cat_id, 'cat_name', ic.name
    )) AS ingredients
FROM recipes r, ingredient_recipe_meta ir, ingredients i, ingredient_category ic
WHERE r.id = ir.recipe_id
AND i.id = ir.ingredient_id
AND i.cat_id = ic.id
GROUP BY r.id
LIMIT 1

ingredients 列包含来自联接表的数据。数据检索正确,但问题是ingredients 列未转换为正确的 JSON。 正如你所看到的,它最后有点“剪裁”。

我也试过JSON_ARRAY,但现在它没有转换为正确的数组。看起来,字符串太大,不适合列。有没有办法解决这个问题?

更新

问题必须是在列中不适合的刺痛大小。我试图从连接表中选择更少的列,并且它工作正常。也许有办法在选择时将我的 json 列转换为“on fly”文本?我试图将列转换为类似

的文本
CAST(GROUP_CONCAT(...   AS TEXT) 

但它给出了语法错误

【问题讨论】:

这是来自 phpMyAdmin 的快照吗?它对显示的字段长度有限制,当超过时,数据将被剪切,尽管 MySQL 正在检索完整数据。编辑行应该显示完整的数据。如果没有,请尝试直接在 MySQL 数据引擎中查看结果。 是的,但它与 phpMyAdmin 无关。我转储并记录了结果,它不是正确的 JSON 所以,将不正确的 JSON 添加到您的问题中,以便我们可以看到它有什么问题,最好是您丢弃的那个。请不要使用这种古老的连接语法。使用正确的 INNER|LEFT|RIGHT JOIN 语法。 我的疯狂猜测是它与该数据库列上的某些非 ansi 字符有关... 见:group_concat_max_len 【参考方案1】:

问题是因为 GROUP_CONCAT 函数的字符串长度有限,即 1024,这要感谢 @Paul Spiegel 在 cmets 部分中提到的这一点。长度可以轻松增加,这个post解释清楚了

【讨论】:

以上是关于mysql没有返回正确的json的主要内容,如果未能解决你的问题,请参考以下文章

PHP、MySQL、jQuery、AJAX:json 数据返回正确响应但前端返回错误

为啥 PHP 没有为 json 文件返回正确的 mime?

JSON字符串没有得到正确的值返回错误

Json 没有以所需的模式返回正确的值

如何正确使用 PHP 将 MySQL 对象编码为 JSON?

MySQL Union 没有正确返回表名