java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'title'

时间:2023-01-10 17:52:04

该问题发生在向数据库插入String中是出现乱码问题:
网上有很多解决办法,但是只有自己结果的方法才是好方法
问题的原因:
(1).创建数据库的时候数据编码设置错误
(2).连接数据库的时候数据编码设置错误
(3).创建表的时候数据编码设置错误
第一个问题解决办法是设置数据库的字符集
第二个问题的解决办法是
jdbc.url=jdbc:mysql://localhost:3306/ecmbs?useUnicode=true&characterEncoding=utf8
第三个解决办法
创建字段时使用utf8mp4字符集
但是此时依然是乱码,这是因为进行IO操作(获取文本字符内容)的时候没有使用OutputStreamReader,使用OutputStreamReader的话可以将编码设置为gbk

logger.info("向Photo表插入信息!");
        //声明一个PhotoModel类的对象保存要插入的对象
        PhotoModel photoModel = new PhotoModel();
        photoModel.setTitle("富山春居图");
        //定义一个字符串变量保存从一个文件中读取的内容
        String remark = null;
        //定义一个字节数组变量保存从一张图片中读取的内容
        byte[] picture = null;
        //声明一个字符输入流读取文件中的内容
        InputStreamReader read = null;
        //定义一个字节输入流对象读取照片的文件
        InputStream inputStream =  null;
        //定义一个整型变量保存插入结果的返回值
        int flag = 0;
        try{
            //声明File类的对象并实例化
            File fileRemark = new File("G:"+File.separator+"remark.txt");
            File filePictrue = new File("G:"+fileRemark.separator+"ECMBS.jpg");
            //定义一个StringBuffer保存从文件中读取的数据
            StringBuffer buf = new StringBuffer();
            //声明一个字符输入流读取文件中的内容
            read = new InputStreamReader(new FileInputStream(fileRemark),"gbk");
            //定义一个变量保存读取的字符
            int ch = read.read();
            //当没有字符时,返回-1
            while(ch != -1){
                buf.append((char)ch);
                ch = read.read();
            }
            System.out.println("buf = "+buf.toString());
            //将字符数组转化为字符串,并赋值给PhotoModel对象的成员变量
            photoModel.setRemark(buf.toString());
            //定义一个字节输入流对象读取照片的文件
            inputStream = new FileInputStream(filePictrue);
            //定义一个字节数组保存读取照片内容
            picture = new byte[inputStream.available()];
            //读取照片内容
            inputStream.read(picture);
            //将读取的内容传给PhotoModel的对象
            photoModel.setPicture(picture);
            //执行插入操作
            flag = photoMapper.insertPhoto(photoModel);
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            try {
                //关闭输入输出流
                inputStream.close();
                read.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            //提交数据库操作
            sqlSession.commit();
        }
        System.out.println("插入操作的返回结果是:"+flag);