MySQL语句中有IFNULL , 查询结果返回 [B@......类的结果

问题描述:根据开发反馈由于应用查询MySQL数据库的数据,对查询结果部分为空判断后有部分数值出现[B@之类的数组,如下图所示。整条sql在数据库中查询没有出现这种乱码情况。

MySQL环境下:

  执行sql:

SELECT
    DATE_FORMAT(fromtime, '%Y%m') MONTH,
    IFNULL(SUM(income), '')  income,
    IFNULL(SUM(tickets), '')  tickets,
    IFNULL(SUM(weight), '')  weight
FROM
    (
        SELECT
            fromtime,
            income,
            tickets,
            weight,
            outpay
        FROM
            rawdata_erp_fache_final
        WHERE
            usr_no = '88868'
        AND DATE_FORMAT(fromtime, '%Y-%m') > DATE_FORMAT(
            DATE_SUB(
                CURRENT_TIMESTAMP,
                INTERVAL 12 MONTH
            ),
            '%Y-%m'
        )
        ORDER BY
            fromtime DESC
    ) t
GROUP BY
    MONTH

 执行结果是:MySQL语句中有IFNULL , 查询结果返回 [B@......类的结果_第1张图片

可是到了项目开发中,拿到的数据是却是 [B@......

当不使用IFNULL判空判断的话,开发拿到的结果是正常的数字,但是一旦经过判空,则返回了[B@......

查询mysql官方文档:sum()和avg()函数对于精确值参数(integer或decimal)的返回一个decimal,以及近似值参数(float或double)的返回double.

IFNULL:BINARY(二进制)和VARBINARY(可变二进制),就是CHAR和VARCHAR是类型的关系。他们都是二进制字符串而不是包含非二进制字符串。也就是说,它们包含字节串而不是字符串。这意味着它们具有二进制字符集和排序规则,比较和排序是基于字节的数值

经查看数据库发现那些字段都是decimal类型的,这样经过sum函数计算之后值应该是decimal类型,但是IFNULL后面却跟了个 ‘’空串,这样的话返回的数据类型是string类型。在navicat中对应的是varchar型,他会自己根据结果的不同转换成不同的格式,但是java就不可以,java遇到varbinary不会转换的

验证结果:(1)将IFNULL后面的第二个参数改为零,java中默认返回该字段的默认值(decimal返回0.00,int返回0)

                  (2)在IFNULL函数整体后面乘以1,这样将数据强转成了decimal即double类型

原因:应用从数据库中查询的结果需要字符类型的数据,如果是VARBINARY数据类型的数据,数据库查询会正常返回相应的字符结果,但java应用却无法转换这种字节串数据。

 

 

 

 

 

你可能感兴趣的:(MySQL语句中有IFNULL , 查询结果返回 [B@......类的结果)