更新时间:2025-05-29 GMT+08:00

需自行解析文件的导出场景

在从数据库中导出数据文件后,需要自行解析文件的导出场景下,FIXED格式的数据具有固定结构,每行对应一条记录,且每行中各字段值的起始偏移量和长度均固定,这使得文件解析更为便捷。因此,在该场景下,用户可选用FIXED格式。不过,FIXED格式存在一些使用约束,具体详情请参考FIXED详解

建议导出命令:

1
2
3
4
COPY {data_source} FROM '/path/export.fixed' encoding {server_encoding} FIXED FORMATTER(col1_name(col1_offset, col1_length), col2_name(col2_offset, col2_length));
--data_source 可以是一个表名称,也可以是一个select语句
--server_encoding 可以通过show server_encoding获得
--col1_name(col1_offset, col1_length) 表示在数据文件的每一行里,名为col1_name的数据是从偏移量为col1_offset的位置开始,长度为 col1_length的部分

对应导入命令:

1
2
3
4
COPY {data_destination} from '/path/export.fixed' encoding {file_encoding} FIXED FORMATTER(col1_name(col1_offset, col1_length), col2_name(col2_offset, col2_length));
--data_destination 只能是一个表名称
--file_encoding 为该文件导出时指定的编码格式
--col1_name(col1_offset, col1_length) 表示在数据文件的每一行里,名为col1_name的数据是从偏移量为col1_offset的位置开始,长度为 col1_length的部分

固定列宽格式的适用场景具有特定限制:该格式要求表中各字段数据宽度保持相对均匀,能够为每列选取固定的col_length值,既避免数据截断又不会产生冗余空格。若实际数据存在字段宽度差异较大或动态变化的情况,建议优先选用TEXT或CSV等弹性格式,以确保数据存储的完整性和空间利用率。

示例

  1. 数据准备。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    gaussdb=# create database db1 encoding='UTF-8' LC_COLLATE='en_US.UTF-8' LC_CTYPE ='en_US.UTF-8' dbcompatibility = 'A';
    CREATE DATABASE
    gaussdb=# \c db1
    Non-SSL connection (SSL connection is recommended when requiring high-security)
    You are now connected to database "db1" as user "omm".
    db1=# CREATE TABLE test_copy(id int, name text);
    CREATE TABLE
    db1=# insert into test_copy values(1, 'aaa');
    INSERT 0 1
    db1=# insert into test_copy values(2, 'bb"b');
    INSERT 0 1
    db1=# insert into test_copy values(3, 'cc  c');
    INSERT 0 1
    db1=# insert into test_copy values('', e'dd\td');
    INSERT 0 1
    db1=# insert into test_copy values('5', e'ee\e');
    INSERT 0 1
    db1=# select * from test_copy;
     id |   name    
    ----+-----------
      1 | aaa
      2 | bb"b
      3 | cc  c
        | dd      d
      5 | eee
    (5 rows)
    

  2. 数据导出。

    1
    2
    db1=# COPY test_copy TO '/home/xy/test.fixed' encoding 'UTF-8' FIXED FORMATTER(id(0,1), name(1,5));
    COPY 5
    

    导出数据文件内容如下所示:

    1
    2
    3
    4
    5
    1  aaa
    2 bb"b
    3cc  c
      dd	d
    5  eee
    

  3. 数据导入。

    db1=# truncate test_copy;
    TRUNCATE TABLE
    db1=# copy test_copy from '/home/xy/test.fixed' encoding 'UTF-8' FIXED FORMATTER(id(0,1), name(1,5));
    COPY 5