【问题标题】:oracle base 64 decode to cloboracle base 64解码为clob
【发布时间】:2018-05-21 18:52:24
【问题描述】:

我在 oracle 表中存在 base 64 加密数据格式的数据。此数据存在于 clob 字段中。

create table tableA
(
id number, 
encoded_description clob);

insert into tableA 
(id, encoded_description) 
values
(1, 'Zm9sbG93IHVw');

insert into tableA 
(id, encoded_description) 
values
(2, 'dG8gbWFueSByZWQgZmxhZ3M=');

commit;

Table A output which contains base64 encoded data in encoded_description field: 

Table A: 

    ID, encoded_description 
    1   Zm9sbG93IHVw
    2   dG8gbWFueSByZWQgZmxhZ3M=



 create table tableB
    (
    id number, 
    decoded_description clob);

Table B: output after conversion 

    ID, Decoded_description
    1   <<Original Text>>
    2   <<Original Text>>

我想通过将 clob 字段中的 base64 数据解码为其原始文本形式,将 tableA 中的数据加载到 tableB 中。我怎样才能做到这一点?我可以使用任何 oracle 函数来执行此转换吗?请帮忙

【问题讨论】:

  • (迂腐评论):Base64 不是“加密”,而是“编码”。
  • 这里缺少一些东西:步骤#1,当你解码 Base64 时,你会得到二进制数据(不是字符)。然后,第 2 步,您需要将二进制转换为 varchar,方法是使用...哪个编码? UTF-8、ASCII、ISO-8859-1、其他?
  • 实际上有一个内置的utl_encode.base64_decode,但它解码为字节,而不是字符。您可以使用 utl_raw.cast_to_raw 和 utl_raw.cast_to_varchar2 来回切换,但您可能会得到垃圾,除非它确实是经过编码的纯文本,这将毫无意义。
  • @TheImpaler 转换为 UTF-8

标签: sql oracle encoding base64


【解决方案1】:

假设您的数据足够大,实际上需要存储在 CLOB 中(即几千个字符),您需要执行以下操作:

  1. 从表中检索您的 CLOB。
  2. 使用 utl_lob.converttoblob 转换为 BLOB。
  3. 使用utl_lob.substr 将BLOB 分成几部分,这会返回一个RAW。每个部分必须小于 2000 个字符和 4 个字节的倍数的 RAW 大小限制(为什么是 4?请参阅:Is it possible to base64-encode a file in chunks?
  4. 使用utl_encode.base64_decode 对块进行base64 解码。
  5. 使用utl_raw.cast_to_varchar2 将解码后的块转换回varchar2。
  6. 将所有解码的块连接成一个 CLOB。

如果您的编码数据不在预期的字符集中,第 5 步可能会导致一些字符集问题,但我并不完全清楚该转换是如何工作的。

显然,您想为此编写一个函数,这样您就不必多次这样做了。

【讨论】:

  • 您可以直接使用UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encoded_description))) - 只要字符串不超过 32k 个字符。否则,您必须分块使用 CLOB/BLOB,请参阅 stackoverflow.com/questions/3804279/…
  • @eaolson。你能解释一下第2步的目的吗?转换为blob是强制性的吗?
  • 并非如此。而且我忘记了 RAW 限制是 32K 而不是 2K,所以 WernfriedDomscheit 的建议可能要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多