
# 需自行解析文件的导出场景
在从数据库中导出数据文件后，需要自行解析文件的导出场景下，FIXED格式的数据具有固定结构，每行对应一条记录，且每行中各字段值的起始偏移量和长度均固定，这使得文件解析更为便捷。因此，在该场景下，用户可选用FIXED格式。不过，FIXED格式存在一些使用约束，具体详情请参考[FIXED详解](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0531.html#ZH-CN_TOPIC_0000002527826192__zh-cn_topic_0000002526895770_li741162614616)。
导出命令：
```
--data_source可以是一个表名称，也可以是一个select语句。
--server_encoding可以通过show server_encoding获得。
--col1_name(col1_offset, col1_length)表示在数据文件的每一行里，名为col1_name的数据是从偏移量为col1_offset的位置开始，长度为col1_length的部分。
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_destination只能是一个表名称
--file_encoding 为该文件导出时指定的编码格式
--col1_name(col1_offset, col1_length) 表示在数据文件的每一行里，名为col1_name的数据是从偏移量为col1_offset的位置开始，长度为 col1_length的部分
COPY {data_destination} FROM '/path/export.fixed' ENCODING {file_encoding} FIXED FORMATTER(col1_name(col1_offset, col1_length), col2_name(col2_offset, col2_length));
```
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
固定列宽格式的适用场景具有特定限制：该格式要求表中各字段数据宽度保持相对均匀，能够为每列选取固定的col_length值，既避免数据截断又不会产生冗余空格。若实际数据存在字段宽度差异较大或动态变化的情况，建议优先选用TEXT或CSV等弹性格式，以确保数据存储的完整性和空间利用率。
#### 示例
1. 数据准备。 
   ```
   gaussdb=# CREATE DATABASE db1 ENCODING='UTF-8' LC_COLLATE='en_US.UTF-8' LC_CTYPE ='en_US.UTF-8' DBCOMPATIBILITY = 'ORA';
   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);
   NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.
   HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
   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. 数据导出。 
   ```
   db1=# COPY test_copy TO '/home/xy/test.fixed' encoding 'UTF-8' FIXED FORMATTER(id(0,1), name(1,5));
   COPY 5
   ```
   导出数据文件内容如下所示：
   ```
   1  aaa
   2 bb"b
   3cc  c
     ddd
   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
   ```
   
   
 
