MySQL部分列乱码问题解决

今天鞋码的 时候发现mysql查询出来的结果没有乱码,传送到java乱码了。原因如下:

查询的方式是解析了某个字段的json串,其实格式化出来的是BLOB类型,外层再套一个select即可发现

select
        S.id,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"trans_remark":',1),'"trans_remark":"'),''),'"',1)
        trans_remark1,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"acct_name":',1),'"acct_name":"'),''),'"',1)
        acct_name1,
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"oth_bank_name":',1),'"oth_bank_name":"'),''),'"',1)
        oth_bank_name1
        from aaaa S
        WHERE S.msg_type = 1
       AND S.id = 107

因为上面的语句是直接格式化JSON出来的,所以其实是二进制流

修改sql语句,增加一层嵌套即可发现

SELECT * FROM(
 select
        S.id,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"trans_remark":',1),'"trans_remark":"'),''),'"',1)
        trans_remark1,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"acct_name":',1),'"acct_name":"'),''),'"',1)
        acct_name1,
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"oth_bank_name":',1),'"oth_bank_name":"'),''),'"',1)
        oth_bank_name1
        
        from t_payroll_cqfmb_asyn_notify S
        WHERE S.msg_type = 1
       AND S.id = 206
) a

此时结果集如下:

当然,在mybatis中直接字段映射并指明类型,java会自己转成String类型的。但是如果有中文的话,就不行了!

那么遇到中文怎么办呢?

我们只需要对sql进行一个小小的改造

SELECT *
,CONVERT(trans_remark1 USING utf8 ) trans_remark
,CONVERT(acct_name1 USING utf8 ) acct_name
,CONVERT(oth_bank_name1 USING utf8 ) oth_bank_name
 FROM(
 select
        S.id,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"trans_remark":',1),'"trans_remark":"'),''),'"',1)
        trans_remark1,   
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"acct_name":',1),'"acct_name":"'),''),'"',1)
        acct_name1,
        SUBSTRING_INDEX(REPLACE(S.msg_json,CONCAT(SUBSTRING_INDEX(S.msg_json,'"oth_bank_name":',1),'"oth_bank_name":"'),''),'"',1)
        oth_bank_name1
        
        from t_payroll_cqfmb_asyn_notify S
        WHERE S.msg_type = 1
       AND S.id = 206
) a

效果如下图,字段已经格式化成功,之后服务端读取的时候就没有问题了,如果不想对原有代码改动太大,as出来一个新的列即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值