达梦数据库-更新clob字段数据只更新进去一部分数据

记一次执行达梦数据库更新clob字段遇到的坑;

clob字段主要用于存储大文本的字符的字段类型,所以项目把前端的json数据直接存进去了;
问题经历:
测试环境:发现了一个前端报错,排查发现前端取到的json数据被截断了;只有部分数据。后端排查发现字段存储确实只有一部分数据;

debug发现:后端执行sql的时候,读取的文件时50058Byte,代码执行时字符长度也是50058;但是update后数据库字段只有32767Byte数据;

同样的代码执行oracle却是正确的;这就很奇怪的现象;

   //更新数据
    public static void saveinfo(InputStream in, int length, String tablename,
                                String pkname, String pkvalue, String columname) throws ParseException {
        Connection conn = null;
        PreparedStatement pstmt = null;

        byte[] datas = new byte[length];
        System.out.println("更新表名是:"+tablename);
        System.out.println("更新表主键字段:"+pkname);
        System.out.println("更新表主键值为:"+pkvalue);
        System.out.println("更新表clob字段为:"+pkvalue);

        String dataStr =null;
        try {
            in.read(datas);
            dataStr = new String(datas,"GBK");

        } catch (IOException e) {
            e.printStackTrace();
        }

        StringReader dataReader = new StringReader(dataStr);

        try {
            conn= JDBCtest.getConn();
            String sql = "update " + tablename + " set " + columname
                    + "= ?, ts = null where " + pkname + " = '" + pkvalue + "'";

            pstmt = JDBCtest.getPStmt(conn, sql);
            System.out.println("更新的clob字段长度为"+dataStr.length());
            pstmt.setCharacterStream(1,dataReader,dataStr.length());
            pstmt.executeUpdate();
            System.out.println("执行更新的sql为:"+sql);
            System.out.println("=========================");
            conn.commit();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            JDBCtest.closeStmt(pstmt);
            JDBCtest.closeConn(conn);


        }
    }

后来联系达梦开发一起调试了发现,环境使用了jdk1.8版本,而达梦数据库驱动使用了jdbc17(对应jdk1.7)导致的;更换为对应的jdbc18即可解决该问题;具体原因没有深挖了;

posted @ 2021-05-14 11:21  菜鸡变小鸟  阅读(1828)  评论(0编辑  收藏  举报