记一次 Mysql Json 格式的查询

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

近期在工作中有接触到 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 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • Java

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

    3167 引用 • 8207 回帖
1 操作
thinrflbtlm 在 2019-05-06 13:19:02 更新了该帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 2 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 46 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 563 关注
  • flomo

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

    3 引用 • 80 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 457 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 453 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 641 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    60 引用 • 287 回帖
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖 • 2 关注
  • V2Ray
    1 引用 • 15 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 23 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 18 关注
  • Vim

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

    27 引用 • 66 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • 自由行
    1 关注
  • Java

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

    3167 引用 • 8207 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 107 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 421 关注
  • 小薇

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

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

    34 引用 • 467 回帖 • 692 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 471 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注