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() 输出为啥成乱码,求高手帮忙。的主要内容,如果未能解决你的问题,请参考以下文章