记一次 Mysql Json 格式的查询

本贴最后更新于 2273 天前,其中的信息可能已经时过境迁

近期在工作中有接触到 MySQL5.7 新增的 Json 存储格式。
之前存储这种 1 对多的可扩展对象都是使用 jsonstr 以 varchar 格式保存。在接触到 json 格式之后,本以为是更加方便,结果出现了一个大问题,在国内网上找资料怎么都是找不到原因(可能是我搜索的方式不对)。在这里记录一下这个事件。
背景:
当 json 对象的值以字符串格式存储的时候,会以 json{"id":id,"jsonParam":"jsonParam"}的形式保存。然后这时候在进行取值的时候,如果使用 jsonName ->'$.jsonParam' as jsonParam 或者 JSON_EXTRACT(jsonName,'$.jsonParam') as jsonParam 的时候会返回

id jsonParam
id "jsonParam"
也就是说返回的结果也会附带“"” 这个时候在 Service 层要处理数据就需要先进行相关的转换。
然而 Json 格式的返回值,无论使用 trim() 还是 JSON_UNQUOTE() 都会出现本地或工具运行时可以看到值,而使用程序的 mybaties 赋值给接收的 JSONObject 对象时,debug 发现总是取不到值的问题。
处理:
使用 debug 时,发现返回值都有 key,但是 value 全是空的,而且奇怪的是,value 中是有对象的,而且有时候还会呈现数组的那种形式。
于是使用 log 方式将这个接收的对象以 jsonStr 的方式打印出来,发现里面的值并不是预想的 String 类型。
进行返回值的类型确认,发现这个值的类型属于 byte[] , 黑人问号.gif
网上各种查资料,有的说是数据库 Connection 的版本问题,可是在升级到 5.1.40 之后仍然无法解决这个问题。。。。。。看起来应该是属于其他的问题导致。
迫于项目的紧急性,之后线将程序功能写出来,后面再慢慢探究其缘由。
不过既然知道返回的数据类型了,就可以很好的进行处理了。
目前想到的方案有 2:
1、mysql 不进行“"”的处理,收到返回值后,使用字符串替换掉“"”。
2、继续在 mysql 中进行“"”的处理,返回值再进行 byte[]的处理。
理论上俩个都是可行的,不过方案 2 相当于多进行了一次数据处理。(以我目前的 LV 还不能确定哪个更优。)
注:JSON_UNQUOTE(JSON_EXTRACT(jsonName,'$.jsonParam')) 等价 <![CDATA[jsonName -> '$.jsonParam']]>
不过我选择的还是第二种方案,原因是我“没法确定”json 的属性值中是否含有自带的“"”(不过其实在当前需求进行 mysql 的表结构设计的时候,是不会出现某个 json 属性为另一个 json 对象 即 {id:id,obj:{id:id}}这种结构。但是为了后面新增功能时少修改的东西,还是使用稳妥的方案 2 看起来更加靠谱。
sql:
<!--<![CDATA[ select AUTHORITY->>'$.flag' flag , AUTHORITY->>'$.ids' ids ]]> from com_position where ID in <foreach collection="positionIds" open="(" item="positionId" separator="," close=")">#{positionId,jdbcType=VARCHAR}</foreach>>--> <![CDATA[ select AUTHORITY->>'$.flag' flag , AUTHORITY->>'$.ids' ids ]]> from com_position where ID in <foreach collection="positionIds" open="(" item="positionId" separator="," close=")">#{positionId,jdbcType=VARCHAR}</foreach>>
// 因为json取值多出“"” 使用替换 // String tmp = authority.getString("ids").replaceAll("\"",""); // authority.put("ids",tmp); // tmp=authority.getString("flag").replaceAll("\"",""); // authority.put("flag",tmp); if(authority.get("ids") instanceof byte[]){ byte[] bytes = (byte[])authority.get("ids"); try { String tt = new String(bytes,"UTF-8"); authority.put("ids",tt); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }

同时也希望有大神能留言告诉小弟,为什么这里使用 JSON_UNQUOTE 和 trim 会且都会变成 byte[]的类型

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖 • 2 关注
1 操作
thinrflbtlm 在 2019-05-06 13:19:02 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 683 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 639 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 656 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 617 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 543 回帖 • 3 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖 • 2 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 61 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 313 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 563 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 179 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 561 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 4 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1284 回帖
  • danl
    181 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 761 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖