---
title: "使用数据编码和压缩 - OceanBase 数据库 V4.2.1 | OceanBase 文档中心"
description: 使用数据编码和压缩 OceanBase 数据库支持 MySQL 和 Oracle 两种模式的租户，为了兼容不同类型用户的使用习惯，OceanBase 数据库在不同模式中提供了不同类型的配置方式来使用数据编码和数据压缩。 OceanBase 数据库支持通过 DDL 来对表级别的压缩或编码方式进行配置。 MySQL 模式…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.1 LTS

# 使用数据编码和压缩

更新时间：2026-04-16 00:11:36

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.1/zh-CN/700.reference/200.system-management/500.manage-data-storage/300.data-compression/200.use-data-encoding-and-compression.md)  

OceanBase 数据库支持 MySQL 和 Oracle 两种模式的租户，为了兼容不同类型用户的使用习惯，OceanBase 数据库在不同模式中提供了不同类型的配置方式来使用数据编码和数据压缩。

OceanBase 数据库支持通过 DDL 来对表级别的压缩或编码方式进行配置。

## MySQL 模式下设置数据的压缩与编码方式

在 MySQL 模式下创建表或修改表时，您可以通过 `row_format` 和 `compression` 来设置编码格式及压缩方式。

语句如下：

- 创建表时，指定表的编码格式和压缩方式

  ```sql
  CREATE TABLE table_name table_definition_list
  ROW_FORMAT [=] row_format COMPRESSION [=] 'compression';

  ```

  更多 `CREATE TABLE` 语句的说明请参见 [CREATE TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221429)。
 - 修改表时，更改表的编码格式和压缩方式

  ```sql
  ALTER TABLE table_name [alter_table_action_list] [SET] ROW_FORMAT [=]row_format COMPRESSION [=]  'compression';

  ```

  更多 `ALTER TABLE` 语句的说明请参见 [ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221389)。

`row_format` 的取值如下：

- `REDUNDANT` 和 `COMPACT`：表示数据不会被编码，数据以 flat 格式被保存。
 - `DYNAMIC`、`COMPRESSED`：表示数据会被编码，数据以 encoding 格式被保存，默认取值为 `DYNAMIC`。
 - `CONDENSED`：表示数据会被编码，数据以 selective encoding 格式被保存。

  selective encoding 格式是 encoding 格式的子集，仅使用查询更友好的编码方式。

`compression` 的取值如下：

- `none`：表示数据不压缩。
 - `lz4_1.0`：表示指定压缩算法为 lz4_1.0。
 - `snappy_1.0`：表示指定压缩算法为 snappy_1.0。
 - `zlib_1.0`：表示指定压缩算法为 zlib_1.0。

  #### 说明

  zlib_1.0 压缩算法在当前版本仅支持查看，不支持修改。
 - `zstd_1.0`：表示指定压缩算法为 zstd_1.0。
 - `zstd_1.3.8`：表示指定压缩算法为 zstd_1.3.8。默认取值为 `zstd_1.3.8`。
 - `lz4_1.9.1`：表示指定压缩算法为 lz4_1.9.1。

示例如下：

- 创建表时指定编码格式和压缩方式

  执行以下语句，在创建表时指定表的编码格式为 encoding 格式和压缩方式为 zstd_1.0。

  ```sql
  obclient> CREATE TABLE test (
   id INT NOT NULL,
   fname VARCHAR(30),
   lname VARCHAR(30),
   hired DATE NOT NULL DEFAULT '1970-01-01',
   separated DATE NOT NULL DEFAULT '9999-12-31',
   job_code INT NOT NULL,
   store_id INT NOT NULL
  ) ROW_FORMAT=CONDENSED COMPRESSION='zstd_1.0';

  ```
 - 修改表时，更改表的编码格式和压缩方式

  执行以下语句，将表的编码格式修改为 selective encoding 格式，压缩方式修改为 lz4_1.0。

  ```sql
  obclient> ALTER TABLE test SET ROW_FORMAT = CONDENSED COMPRESSION = 'lz4_1.0';

  ```

## Oracle 模式下设置数据的压缩与编码方式

在 Oracle 模式下创建表或修改表时，也可以指定数据的编码格式和压缩方式。

语句如下：

- 创建表时，指定编码格式和压缩方式

  ```sql
  CREATE TABLE table_name table_definition_list compression;

  ```

  更多 `CREATE TABLE` 语句的说明请参见 [CREATE TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222087)。
 - 修改表时，更改表的编码格式和压缩方式

  ```sql
  ALTER TABLE table_name [alter_table_action_list] compression;

  ```

  更多 `ALTER TABLE` 语句的说明请参见 [ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222097)。

其中，`compression` 的取值如下：

- `NOCOMPRESS`：表示数据不会被编码或压缩，数据以 flat 格式被保存。
 - `COMPRESS BASIC`：表示数据不会被编码，数据以 flat 格式被保存，并使用 lz4_1.0 压缩。
 - `COMPRESS FOR OLTP`：表示数据不会被编码，数据以 flat 格式被保存，并使用 zstd_1.3.8 压缩。
 - `COMPRESS FOR QUERY`：表示数据会被编码，数据以 encoding 格式被保存，并使用 lz4_1.0 压缩。
 - `COMPRESS FOR ARCHIVE`：表示数据会被编码，数据以 encoding 格式被保存，并使用 zstd_1.3.8 压缩。默认取值为 `COMPRESS FOR ARCHIVE`。
 - `COMPRESS FOR QUERY LOW`：表示数据会被编码，数据以 selective encoding 格式被保存，并使用 lz4_1.0 压缩。

示例如下：

  执行以下语句，在创建表时指定表的编码格式为 encoding 格式，压缩方式为 lz4_1.0。

  ```sql
  obclient> CREATE TABLE test (
  id number NOT NULL,
  fname VARCHAR2(30),
  lname VARCHAR2(30),
  hired DATE NOT NULL DEFAULT sysdate,
  separated DATE,
  job_code INT NOT NULL,
  store_id INT NOT NULL
  ) COMPRESS FOR QUERY;

  执行以下语句，将表的编码格式修改为 encoding 格式，压缩方式修改为 zstd_1.3.8。

  ```sql
  obclient> ALTER TABLE test COMPRESS FOR ARCHIVE;

  ```

## 对已经生成 SSTable 的表更改压缩方式

对已经生成了 SSTable 的表进行压缩选项的变更时，为了避免给一次合并带来太大的 IO 写入压力，需要通过渐进合并的方式逐渐重写全部的微块数据，来完成压缩方式的变更。渐进合并的轮次可以通过在 `ALTER TABLE` 语句中设置 `progressive_merge_num` 的值来完成。

具体方法如下：

1. 租户管理员登录到数据库。
 2. 执行以下语句，设置渐进合并轮次。

   `progressive_merge_num` 用于设置表的渐进合并的轮次，默认为 `0`，表示进行增量合并。如果值设置为 `1`，则表示进行全量合并。

   设置渐进合并轮次为 2 次的示例如下：

   ```sql
   obclient> ALTER TABLE t1 SET progressive_merge_num=2;

   ```

   设置成功后，后续系统会在每日合并中逐渐完成数据的重写。

#### 说明

如果希望尽快完成数据的重写，可以将 `progressive_merge_num` 的值设置为 `1` 后，手动发起一次合并，手动发起合并的操作请参见 [手动触发合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218883)。

3. 更改压缩选项。

   MySQL 模式下更改压缩选项的操作请参见本节 **MySQL 模式下设置数据的压缩与编码方式**。

   Oracle 模式下更改压缩选项的操作请参见本节 **Oracle 模式下设置数据的压缩与编码方式**。

 上一篇 下一篇 ![有帮助](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) 咨询热线
