【问题标题】:Oracle BLOB (with base 64 encoding) to StringOracle BLOB(使用 base 64 编码)转字符串
【发布时间】:2013-12-19 00:21:20
【问题描述】:

我正在从 DB 中读取 Oracle BLOB,并希望将其转换为可读字符串。 BLOB 是用二进制编码的文本,我很确定它是用 Base64 编码的。

我读取 BLOB 的代码返回了一个带有无法识别字符的字符串:

 public String getStringFromBLOB(String sql) {
    ...
    resultSet.next();
    BLOB blob = null;          
    blob = ((OracleResultSet) resultSet).getBLOB(1);

    byte[] bdata = blob.getBytes(1, (int) blob.length());       
    String tmpStr =new String(bdata);
    str = new String(tmpStr.getBytes("UTF8"), "EUC_KR");
    return str;
}

任何帮助将不胜感激。

【问题讨论】:

  • 为什么要将生成的 byte[] 转换为字符串?你确定它是一个字符串?还有UTF8?如果是这样,为什么将其存储为 BLOB?
  • 如果你将它存储为一个 blob,你为什么还要费心对它进行 base-64 编码呢?在我看来,您需要更仔细地调查真实情况。
  • 也许你的意思是return new String(bdata, "EUC_KR");
  • 通常使用 BASE64 编码的文本来防止它被各种字符串转换破坏。

标签: java oracle blob


【解决方案1】:

应该这样做。

byte[] bdata = blob.getBytes(0, (int) blob.length()); // From 0
String data = new String(bdata, "US-ASCII"); // As it claimed to be Base64
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
return new String(bytes, "EUC_KR"); // The original encoding before Base64

【讨论】:

  • 感谢您的回复,但有两件事:首先,我认为 blob.getBytes 应该从索引 1 而不是 0 开始。其次,当尝试运行它时,第三行抛出异常:“java.lang.ArrayIndexOutOfBoundsException:65533”。找不到原因。再次感谢
  • 你从 1 开始是对的,至少 w.r.t.我知道的界面 Blob。该异常可能表明 parseBase64Binary 的编程草率且数据不是 Base64。
【解决方案2】:

如果您希望它作为可读文本,您可以使用utl_encode 包中提供的函数对其进行转换。

utl_encode.base64_decode()

一些来自elsewhere 的代码使用它:

FUNCTION get_blob_from_base64_string (p_clob CLOB)
RETURN BLOB
IS
l_chunk BLOB; --Chunks of decoded blob that'll be appended
l_result BLOB; --Final blob result to be returned
l_rawout RAW (32767); --Decoded raw data from first pass decode
l_rawin RAW (32767); --Encoded raw data chunk
l_amt NUMBER DEFAULT 7700; --Default length of data to decode
l_offset NUMBER DEFAULT 1; --Default Offset of data to decode
l_tempvarchar VARCHAR2 (32767);
BEGIN
BEGIN
DBMS_LOB.createtemporary (l_result, FALSE, DBMS_LOB.CALL);
DBMS_LOB.createtemporary (l_chunk, FALSE, DBMS_LOB.CALL);
LOOP
DBMS_LOB.READ (p_clob, l_amt, l_offset, l_tempvarchar);
l_offset := l_amt + l_offset;
l_rawin := UTL_RAW.cast_to_raw (l_tempvarchar);
l_rawout := UTL_ENCODE.base64_decode (l_rawin);
l_chunk := to_blob (l_rawout);
DBMS_LOB.append (l_result, l_chunk);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;

来源是 Oracle 论坛上关于 base64 解码 clob (>32K)

的帖子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2023-03-26
    • 2015-08-09
    • 2013-09-26
    • 1970-01-01
    • 2013-07-09
    • 2017-02-03
    • 2017-06-17
    相关资源
    最近更新 更多