mysql utf8 blob乱码 kindeditor的存入mysql的blob类型产生乱码 - MySQL - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > 数据库服务器 > MySQL

mysql utf8 blob乱码 kindeditor的存入mysql的blob类型产生乱码

发布时间:2017-05-20 来源:服务器之家

在我本地使用正常,在服务器上却出现乱码。 本地数据库类型使用varcher,服务器使用类型bolb(二进制)

前台页面编辑时文字正常显示,但存入后取回查看会产生乱码。乱码如图:

通过查看:存入数据之前未乱码,存入数据后出现乱码,获取数据解码也乱码。

产生原因:当字符串转变为二进制存入bolo中,获取的时候却认为是String,所以显示乱码。

错误想法:取出数据库中二进制,通过gbk 编码为文字,展示。自己实验失败,望大神有会的可以发个链接。 springMVC + mybatis + mysql 

网上寻找的解决方案:

package cn.mon.util;  

import java.io.ByteArrayInputStream;  

import java.io.UnsupportedEncodingException;  

import java.sql.Blob;  

import java.sql.CallableStatement;  

import java.sql.PreparedStatement;  

import java.sql.ResultSet;  

import java.sql.SQLException;  

import org.apache.ibatis.type.BaseTypeHandler;  

import org.apache.ibatis.type.JdbcType;  

/** 

 * className:ConvertBlobTypeHandler 

 *  

 * 自定义typehandler,解决mybatis存储blob字段后,出现乱码的问题 

 * 配置mapper.xml: 

 * <result  typeHandler="cn.mon.util.ConvertBlobTypeHandler"/> 

 *  

 * @author pengyh 

 * @version 1.0.0 

 * @date 2014-07-09 11:15:23 

 *  

 */  

public class ConvertBlobTypeHandler extends BaseTypeHandler<String> {    

    //###指定字符集    

    private static final String DEFAULT_CHARSET = "gbk";    

    @Override    

    public void setNonNullParameter(PreparedStatement ps, int i,    

            String parameter, JdbcType jdbcType) throws SQLException {    

        ByteArrayInputStream bis;    

        try {    

            //###把String转化成byte流    

            bis = new ByteArrayInputStream(parameter.getBytes(DEFAULT_CHARSET));    

        } catch (UnsupportedEncodingException e) {    

            throw new RuntimeException("Blob Encoding Error!");    

        }       

        ps.setBinaryStream(i, bis, parameter.length());    

    }    

    @Override    

    public String getNullableResult(ResultSet rs, String columnName)    

            throws SQLException {    

        Blob blob = rs.getBlob(columnName);    

        byte[] returnValue = null;    

        if (null != blob) {    

            returnValue = blob.getBytes(1, (int) blob.length());    

        }    

        try {    

            //###把byte转化成string    

            return new String(returnValue, DEFAULT_CHARSET);    

        } catch (UnsupportedEncodingException e) {    

            throw new RuntimeException("Blob Encoding Error!");    

        }    

    }    

    @Override    

    public String getNullableResult(CallableStatement cs, int columnIndex)    

            throws SQLException {    

        Blob blob = cs.getBlob(columnIndex);    

        byte[] returnValue = null;    

        if (null != blob) {    

            returnValue = blob.getBytes(1, (int) blob.length());    

        }    

        try {    

            return new String(returnValue, DEFAULT_CHARSET);    

        } catch (UnsupportedEncodingException e) {    

            throw new RuntimeException("Blob Encoding Error!");    

        }    

    }  

    @Override  

    public String getNullableResult(ResultSet arg0, int arg1)  

            throws SQLException {  

        // TODO Auto-generated method stub  

        return null;  

    }    

}   

定义上面类之后,在mapper.xml中配置<result property="content" column="CONTENT" typeHandler="cn.mon.util.ConvertBlobTypeHandler"/>即可。

实体接收使用String接收。