Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。相关的知识,希望对你有一定的参考价值。

网上有很多 将图片的Base64解码,直接用FileOutputStream 输出成图片文件,但是我要的不是要输入成文件,我要的是 解码后变成成字符串传输,直接输出成文件就别回答了。。。

参考技术A CLOB跟客户端NLS_LANG的字符集设置有关系,要保证和DB服务器的设置兼容;BLOB无此影响。 参考技术B FileOutputStream.write(b)

是将byte[]重新生成一个文件。

你可以直接将这些内容,通过其它的流进行传输啊 生成文件都会了,只不过是换一个流而已。追问

生成字符串 是项目需要。我是写ETL 插件,必须要生成字符串。。

追答

那你是不希望生成的字符串是乱码是吗?
如果是这样,一般常用的方式是将byte进行十六进转换
转成一个16进制组成的字符串。你可以进行传输,或是其它什么的。

用的时候,进将这个字符串转换回byte数组。

这样的一个文件流生成出来的byte数组,你用new String(byte[]) 这样生成字符串,多数是乱码,
还有可能丢失字符。。

追问

new String(byte[]) ,打印出来是乱码。。我用的Sun提供的方法来decode,搞不清为什么会是乱码,费解。。。

追答

解决就好。

本回答被提问者和网友采纳
参考技术C 本来就是二进制的,为什么要输出成string追问

生成字符串 是项目需要。我是写ETL 插件,必须要生成字符串。。

Oracle CLOB 字段中的空 CLOB 而不是 NULL

【中文标题】Oracle CLOB 字段中的空 CLOB 而不是 NULL【英文标题】:Empty CLOB instead of NULL in Oracle CLOB field 【发布时间】:2021-12-09 06:31:50 【问题描述】:

使用 Hibernate 将空字符串写入 Oracle CLOB 字段有时会导致字段中出现空 CLOB 而不是 NULL。

具有 varchar2、数字和 CLOB 字段的表 STEP 曾经被扩展为一个新的 CLOB 字段。

ALTER TABLE STEP 
    ADD (IN_PAR_A CLOB) 
    LOB(IN_PAR_A) STORE AS CLOB_STEP_IN_PAR_A 
        (NOCACHE FILESYSTEM_LIKE_LOGGING COMPRESS HIGH TABLESPACE <tblspace for LOBs>);

并在实体中添加了相应的字段

@Entity
@Table(name = "STEP")
@Data
public class Step 
  //some other fields
  @Column(name = "IN_PAR_A")
  private String inParA;

当存储非空值时,所有工作都按预期工作。但是,当使用非空值存储的新记录后来更新为空(使用事务)时,有时字段中存储的是一个空的 CLOB 而不是 NULL。

Step entity = session.get(Step.class, "some ID");
entity.setInParA(null);
//other fields
session.update(entity);

主要问题是不稳定 - 非空值仅写入 1/3..1/4 的记录。我无法通过直接休眠存储 Step 实体在 step.inParA 字段中使用 NULL 和“”的任何组合在系统的开发实例中重现。但它发生在产品系统上。我可以通过添加触发器来调试一个小 Oracle,发现有时它会从驱动程序中获得“”,我再次无法在开发人员中重现。此外,我能够启动大约两打完全相同的序列,这导致了新的 STEP 记录,其中一些存储了空的 CLOB,而大多数存储了空。 我尝试添加一个触发器来将空替换为 NULL,但它破坏了记录 - 不知何故,而不是 NULL 或清空该字段存储了来自其他字段的一些随机数据。

要求 STEP.IN_PAR_A 包含 NULL 而不是空的 CLOB,但我不知道要修复什么。

任何建议将不胜感激。

UPD 正如建议的那样,添加 @Lob 注释会有所帮助。没有这个注释的 5 个表中的旧 14 列可以正常工作(但现在添加了注释)

【问题讨论】:

您是否尝试过改用@Lob 注释?我知道 Hibernate 支持 CLOB 使用 String,但也许对你的情况有帮助 非常感谢,这么简单的技巧帮了大忙!仍然存在疑问,为什么它在没有 @Lob 注释的情况下对所有其他 CLOB 列(5 个表中的 14 列)起作用,并且只有最后一个开始失败。但这不是那么重要。 我会把它作为答案。请接受它,因为其他人可以从中受益 我相信 Hibernate 在处理 clob 的字符串注释方面还有一些处理。 【参考方案1】:

一种解决方案是改用@Lob 注释。尽管 Hibernate 支持字符串来处理 clob 列,但我发现使用此注释总是更好,因此可以避免任何潜在的问题。

在这里你可以找到一篇关于如何使用它的好文章

Hibernate LOB

我个人认为 Hibernate 在使用 string 处理 CLOB 时仍然存在一些问题。我发现自己处于其他奇怪的场景中,使用 @LOB 总是可以解决它们。

【讨论】:

以上是关于Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中的blob字段下读取jpg格式文件保存

Oracle中的BLOB和CLOB字段类型的区别

Oracle中Blob和Clob

orcal中的blob和clob

JAVA读取Oracle数据库Clob字段转换成String问题

hive-drop-import-delims选项对oracle的clob无效