首批通过分布式安全可靠测评,为关键业务系统打造
通过 select into outfile 导出的文件名后缀说明
更新时间:2026-05-28 02:06
select into outfile 语句是常用的一种数据导出方式,该语句能够对需要导出的字段做出限制,这很好地满足了某些不需要导出主键字段的场景。配合 load data infile 语句导入数据,是一种便利的数据导入导出方式。
目前在最新的 OceanBase 数据库 V4.3.5 版本中 select into outfile 支持导出 csv/parquet/orc 三种不同格式的文件,并且在导出文件时支持自动压缩导出文件。
本文主要介绍导出这三种文件格式的具体用法,以及指定文件压缩格式时,导出的文件名后缀规则。
详细说明
导出的文件名后缀命名规则:
当 single=true 时(缺省的配置),导出的文件名不会自动添加任何的后缀,不管有没有开启压缩或者指定 FILE_EXTENSION。
当 single=false 时:
如果没指定 FILE_EXTENSION 的话,会自动添加上导出的文件格式名如
.csv/.parquet/.orc。如果指定了 FILE_EXTENSION 的话,会自动添加上用户指定的 FILE_EXTENSION(仅导出 CSV 格式时适用)。
如果指定了压缩的话导出的文件名最后还会自动添加上对应压缩格式的后缀(仅导出 CSV 格式时适用)。
备注:
- single=true 为缺省的默认值,表示只能导出到单个文件。
- 可选项 FILE_EXTENSTION 用于指定用户自定义的文件扩展名,仅多文件导出时使用,且仅 CSV 格式支持指定。不指定该参数时,文件扩展名由格式类型决定。
测试版本
OceanBase 数据库 V4.3.5 版本。
测试表结构
t1 表为非分区表,表中的行数为 320000 行。
MySQL [test]> show create table test;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`name` varchar(2000) DEFAULT NULL,
`sex` char(10) DEFAULT NULL,
`birth_date` datetime DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 WITH COLUMN GROUP(each column) |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.007 sec)
MySQL [test]> select count(*) from test;
+----------+
| count(*) |
+----------+
| 320000 |
+----------+
1 row in set (0.007 sec)
Case 1)导出 CSV 文件,不指定 single=false+ 不指定压缩,导出的文件名不会额外添加任何的后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4');
Query OK, 320000 rows affected (7.781 sec)
[root@observer ~]# ls -tlr /tmp/test
-rw-r--r-- 1 admin admin 348160000 Jan 8 19:22 /tmp/test
[root@observer ~]# file /tmp/test
/tmp/test: CSV text
[root@observer ~]#
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4',
FILE_EXTENSION = '.abc');
Query OK, 320000 rows affected (7.943 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 348160000 Jan 8 19:25 /tmp/test
[root@observer ~]# file /tmp/test*
/tmp/test: CSV text
Case 2)导出 CSV 文件,不指定 single=false+ 指定压缩,导出的文件名不会额外添加任何的后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4',
FILE_EXTENSION = '.abc',
COMPRESSION = gzip);
Query OK, 320000 rows affected (14.754 sec)
[root@observer ~]# ls -tlr /tmp/test*
-rw-r--r-- 1 admin admin 4476159 Jan 8 19:31 /tmp/test
[root@observer ~]# file /tmp/test
/tmp/test: gzip compressed data, from Unix, original size modulo 2^32 348160000
Case 3)导出 CSV 文件,指定 single=true+ 指定压缩,导出的文件名不会额外添加任何的后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4',
FILE_EXTENSION = '.abc',
COMPRESSION = gzip) single=true;
Query OK, 320000 rows affected (14.766 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 4476159 Jan 8 19:33 /tmp/test
[root@observer ~]# file /tmp/test
/tmp/test: gzip compressed data, from Unix, original size modulo 2^32 348160000
Case 4)导出 CSV 文件,指定 single=false+ 不指定压缩,导出的文件名会自动添加 .csv 后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4') single=false;
Query OK, 320000 rows affected (8.492 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 268434624 Jan 8 19:36 /tmp/test_0.csv
-rw-r--r-- 1 admin admin 79725376 Jan 8 19:36 /tmp/test_1.csv
[root@observer ~]# file /tmp/test_1.csv
/tmp/test_1.csv: CSV text
Case 5)导出 CSV 文件,指定 single=false+ 指定压缩,导出的文件名会自动添加 .csv 后缀,然后再添加上对应的压缩格式后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4',
COMPRESSION = gzip) single=false;
Query OK, 320000 rows affected (15.574 sec)
[root@observer ~]# ls -tlr /tmp/test*
-rw-r--r-- 1 admin admin 4476159 Jan 8 19:39 /tmp/test_0.csv.gz
[root@observer ~]# file /tmp/test_0.csv.gz
/tmp/test_0.csv.gz: gzip compressed data, from Unix, original size modulo 2^32 348160000
Case 6)导出 CSV 文件,指定 single=false+ 指定 FILE_EXTENSION+ 指定压缩,导出的文件名会自动添加 FILE_EXTENSION 后缀,然后再添加上对应的压缩格式后缀
MySQL [test]> SELECT * FROM test
into outfile '/tmp/test'
format = (TYPE = 'CSV',
FIELD_DELIMITER = ',',
ENCODING = 'utf8mb4',
FILE_EXTENSION = '.abc',
COMPRESSION = zstd) single=false;
Query OK, 320000 rows affected (8.293 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 3075734 Jan 8 19:42 /tmp/test_0.abc.zst
[root@observer ~]# file /tmp/test*
/tmp/test_0.abc.zst: Zstandard compressed data (v0.8+), Dictionary ID: None
Case 7)导出 Apache Parquet 文件,不指定 single=false+ 指定压缩,导出的文件名不会额外添加任何的后缀
MySQL [test]> SELECT * FROM test
INTO outfile '/tmp/test'
FORMAT(
TYPE = 'PARQUET',
COMPRESSION = 'SNAPPY'
ROW_GROUP_SIZE = '64MB'
);
Query OK, 320000 rows affected (2.719 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 22547538 Jan 8 19:47 /tmp/test
[root@observer ~]# file /tmp/test*
/tmp/test: Apache Parquet
Case 8)导出 Apache Parquet 文件,指定 single=false+ 指定压缩,导出的文件名会自动添加 .parquet 后缀
MySQL [test]> SELECT * FROM test
INTO outfile '/tmp/test'
FORMAT(
TYPE = 'PARQUET',
COMPRESSION = 'GZIP'
ROW_GROUP_SIZE = '64MB'
) single=false;
Query OK, 320000 rows affected (12.789 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 4072833 Jan 8 19:49 /tmp/test_0.parquet
-rw-r--r-- 1 admin admin 1198440 Jan 8 19:49 /tmp/test_1.parquet
[root@observer ~]# file /tmp/test_1.parquet
/tmp/test_1.parquet: Apache Parquet
Case 9)导出 Apache ORC 文件,不指定 single=false+ 指定压缩,导出的文件名不会额外添加任何的后缀
MySQL [test]> SELECT * FROM test
INTO outfile '/tmp/test'
FORMAT(
TYPE = 'ORC'
COMPRESSION = 'SNAPPY'
COMPRESSION_BLOCK_SIZE = '64KB'
);
Query OK, 320000 rows affected (2.761 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 21783073 Jan 8 19:51 /tmp/test
[root@observer ~]# file /tmp/test
/tmp/test: Apache ORC
Case 10)导出 Apache ORC 文件,指定 single=false+ 指定压缩,导出的文件名会自动添加上 .orc 后缀
MySQL [test]> SELECT * FROM test
INTO outfile '/tmp/test'
FORMAT(
TYPE = 'ORC'
COMPRESSION = 'ZLIB'
COMPRESSION_BLOCK_SIZE = '64KB'
) single=false;
Query OK, 320000 rows affected (5.769 sec)
[root@observer ~]# ls -ltr /tmp/test*
-rw-r--r-- 1 admin admin 6518406 Jan 8 19:54 /tmp/test_0.orc
[root@observer ~]# file /tmp/test_0.orc
/tmp/test_0.orc: Apache ORC
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V4.3.5 及之后版本。