首批通过分布式安全可靠测评,为关键业务系统打造
如何将通过 dump 函数 dump 出来的 16 进制编码值解码回原始的内容
更新时间:2026-05-19 08:21
OceanBase 数据库 Oracle 模式中提供了一个跟原生 Oracle 兼容的 dump 函数,该函数返回指定表达式的数据类型代码、字节长度和表达式的内部表示形式。关于该函数的详细语法解释和示例可以参考:dump。使用该函数时,如果指定了 dump 出来的格式为十六进制,将返回指定表达式在 OceanBase 数据库 Oracle 内部的 16 进制的存储信息(包括数据类型、字节长度和实际存储的字节值)。 本文主要介绍如何将 dump 出来的 16 进制编码值反解码回原始的可读内容。
详细说明
varchar/varchar2 类型
obclient(SYS@oracle)[SYS]> select dump('OceanBase', 16) from dual;
+------------------------------------------+
| DUMP('OCEANBASE',16) |
+------------------------------------------+
| Typ=23 Len=9: 4f,63,65,61,6e,42,61,73,65 |
+------------------------------------------+
1 row in set (0.002 sec)
obclient(SYS@oracle)[SYS]>
-- 反向解码如下:
-- 需要将逗号去掉后拼接起来,每个通过逗号分隔的值都需要写成两位的十六进制数值
obclient(SYS@oracle)[SYS]> select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('4f6365616e42617365')) from dual;
+----------------------------------------------------------+
| UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('4F6365616E42617365')) |
+----------------------------------------------------------+
| OceanBase |
+----------------------------------------------------------+
1 row in set (0.363 sec)
number 类型
obclient(SYS@oracle)[SYS]> select dump(123456789, 16) from dual;
+-----------------------------------+
| DUMP(123456789,16) |
+-----------------------------------+
| Typ=15 Len=8: 1,0,0,c0,15,cd,5b,7 |
+-----------------------------------+
1 row in set (0.000 sec)
-- 反向解码如下:
-- 需要将逗号去掉后拼接起来,每个通过逗号分隔的值都需要写成两位的十六进制数值
obclient(SYS@oracle)[SYS]> select UTL_RAW.CAST_TO_NUMBER(HEXTORAW('010000c015cd5b07')) from dual;
+------------------------------------------------------+
| UTL_RAW.CAST_TO_NUMBER(HEXTORAW('010000C015CD5B07')) |
+------------------------------------------------------+
| 123456789 |
+------------------------------------------------------+
1 row in set (0.025 sec)
timestmap 类型
说明:在底层存储上,OceanBase 数据库 Oracle 的 Timestamp 类型使用了 10 个字节。
obclient(SYS@oracle)[SYS]> select dump(to_timestamp(, 'yyyy-mm-dd hh24:mi:ss:ff'), 16) from dual;
+------------------------------------------------------------------------------+
| DUMP(TO_TIMESTAMP('2025-07-1910:32:13.387656','YYYY-MM-DDHH24:MI:SS:FF'),16) |
+------------------------------------------------------------------------------+
| Typ=38 Len=10: 0,0,88,8f,79,c1,45,3a,6,0 |
+------------------------------------------------------------------------------+
1 row in set (0.003 sec)
-- 首先将逗号去掉后再反向拼接起来,注意每个通过逗号分隔的值都需要写成两位的十六进制数值
-- 然后将 16 进制的数值转成对应的 10 进制数值
obclient(SYS@oracle)[SYS]> select to_number('00063a45c1798f88', 'XXXXXXXXXXXXXXXX') as dec_value from dual;
+------------------+
| DEC_VALUE |
+------------------+
| 1752921133387656 |
+------------------+
1 row in set (0.002 sec)
-- 最后将10进制的值通过SCN_TO_TIMESTAMP函数解码出来
obclient(SYS@oracle)[SYS]> select scn_to_timestamp(1752921133387656 * 1000 - 28800000000000) from dual;
+--------------------------------------------------------+
| SCN_TO_TIMESTAMP(1752921133387656*1000-28800000000000) |
+--------------------------------------------------------+
| 2025-07-19 10:32:13.387656000 |
+--------------------------------------------------------+
1 row in set (0.017 sec)
说明:这边的 28800000000000 对应的是 SCN 在本地时区和 UTC 时区的偏移量,如果本地时区就是 UTC 时区,则不需要减去该偏移量:
obclient(SYS@oracle_utc)[SYS]> select dump(to_timestamp('2025-07-19 10:32:13.387656', 'yyyy-mm-dd hh24:mi:ss:ff'), 16) from dual;
+------------------------------------------------------------------------------+
| DUMP(TO_TIMESTAMP('2025-07-1910:32:13.387656','YYYY-MM-DDHH24:MI:SS:FF'),16) |
+------------------------------------------------------------------------------+
| Typ=38 Len=10: 0,0,88,8f,79,c1,45,3a,6,0 |
+------------------------------------------------------------------------------+
1 row in set (0.009 sec)
obclient(SYS@oracle_utc)[SYS]> select to_number('00063a45c1798f88', 'XXXXXXXXXXXXXXXX') as dec_value from dual;
+------------------+
| DEC_VALUE |
+------------------+
| 1752921133387656 |
+------------------+
1 row in set (0.005 sec)
obclient(SYS@oracle_utc)[SYS]> select scn_to_timestamp(1752921133387656 * 1000) from dual;
+-----------------------------------------+
| SCN_TO_TIMESTAMP(1752921133387656*1000) |
+-----------------------------------------+
| 2025-07-19 10:32:13.387656000 |
+-----------------------------------------+
1 row in set (0.003 sec)
date 类型
说明:在底层存储上,OceanBase 数据库 Oracle 模式的 date 类型使用了 8 个字节。date 类型的解码方式和 timestamp 类型类似:
obclient(SYS@oracle)[SYS]> select dump(to_date('2025-07-24 12:17:21', 'yyyy-mm-dd hh24:mi:ss'), 16) from dual;
+---------------------------------------------------------------+
| DUMP(TO_DATE('2025-07-2412:17:21','YYYY-MM-DDHH24:MI:SS'),16) |
+---------------------------------------------------------------+
| Typ=17 Len=8: 40,f6,a4,ce,ab,3a,6,0 |
+---------------------------------------------------------------+
1 row in set (0.002 sec)
-- 首先将逗号去掉后再反向拼接起来,注意每个通过逗号分隔的值都需要写成两位的十六进制数值
-- 然后将 16 进制的数值转成对应的 10 进制数值
obclient(SYS@oracle)[SYS]> select to_number('00063aabcea4f640', 'XXXXXXXXXXXXXXXX') as dec_value from dual;
+------------------+
| DEC_VALUE |
+------------------+
| 1753359441000000 |
+------------------+
1 row in set (0.000 sec)
-- 最后将 10 进制的值通过 SCN_TO_TIMESTAMP 函数解码出来
obclient(SYS@oracle)[SYS]> select scn_to_timestamp(1753359441000000 * 1000 - 28800000000000) from dual;
+--------------------------------------------------------+
| SCN_TO_TIMESTAMP(1753359441000000*1000-28800000000000) |
+--------------------------------------------------------+
| 2025-07-24 12:17:21.000000000 |
+--------------------------------------------------------+
1 row in set (0.000 sec)
适用版本
OceanBase 数据库 Oracle 模式所有版本。