---
title: 如何将通过 dump 函数 dump 出来的 16 进制编码值解码回原始的内容-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于如何将通过 dump 函数 dump 出来的 16 进制编码值解码回原始的内容相关的常见问题和使用技巧，帮助您快速解决如何将通过 dump 函数 dump 出来的 16 进制编码值解码回原始的内容的难题。
---
切换语言

- 简体中文
- English

划线反馈

# 如何将通过 dump 函数 dump 出来的 16 进制编码值解码回原始的内容

更新时间：2026-05-19 08:21

适用版本： V1.4.x、V2.1.x、V2.2.x、V3.1.x、V3.2.x、V4.0.x、V4.1.x、V4.2.x、V4.3.x、V4.4.x 内容类型：TechNote  

OceanBase 数据库 Oracle 模式中提供了一个跟原生 Oracle 兼容的 dump 函数，该函数返回指定表达式的数据类型代码、字节长度和表达式的内部表示形式。关于该函数的详细语法解释和示例可以参考：[dump](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003384178)。使用该函数时，如果指定了 dump 出来的格式为十六进制，将返回指定表达式在 OceanBase 数据库 Oracle 内部的 16 进制的存储信息（包括数据类型、字节长度和实际存储的字节值）。 本文主要介绍如何将 dump 出来的 16 进制编码值反解码回原始的可读内容。

## 详细说明

### varchar/varchar2 类型

```shell
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 类型

```shell
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 个字节**。

```shell
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 时区，则不需要减去该偏移量**：

```shell
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 类型类似：

```shell
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 模式所有版本。

Previous

[程序调用 blob.setBytes(1,bytes,0,bytes.length) 插入 blob 报错 ORA-25137:Data value out of range，数据库报错：char type length is too long ret=-4157](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000002393333)

Next

[OceanBase 数据库 Oracle 模式下的 CAST_FROM_NUMBER 和 CAST_TO_NUMBER 函数不兼容原生 Oracle 结果](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003318077) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
