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

推荐CSV格式

CSV格式通过换行符将整个文件划分为多条记录,再通过分隔符(delimiter,默认值为逗号',')将每条记录划分为多个字段,每一个字段可以通过封闭符(quote,默认值为引号'"')包裹起来。通过这种方式,无需对特殊字符进行转义,即可解决字段内容中出现的行结束符和分隔符等特殊字符问题。同时它是一项通用标准,具备跨平台兼容性和行业普适性,所以优先推荐采用该格式。

导出命令:

1
2
3
--data_source可以是一个表名称,也可以是一个select语句。
--server_encoding 可以通过show server_encoding获得。
COPY {data_source} TO '/path/export.csv' delimiter ',' quote '"' escape '"' ENCODING {server_encoding} CSV;

导入命令:

1
2
3
--data_destination只能是一个表名称。
--file_encoding为该文件导出时指定的编码格式。
COPY {data_destination} FROM '/path/export.csv' delimiter ',' quote '"' escape '"' ENCODING {file_encoding} CSV;

若用户自行生成CSV数据文件并导入数据库,需确保数据文件严格遵循CSV格式的标准规范,同时保证在使用COPY命令时,传入的分隔符、封闭符、行结束符等参数准确无误。

示例

  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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    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, e'bb\nb');
    INSERT 0 1
    db1=# INSERT INTO test_copy VALUES(3, e'cc\tc');
    INSERT 0 1
    db1=# INSERT INTO test_copy(name) VALUES('ddd');
    INSERT 0 1
    db1=# INSERT INTO test_copy VALUES(5, e'ee\\e');
    INSERT 0 1
    db1=# INSERT INTO test_copy VALUES(6, ',');
    INSERT 0 1
    db1=# INSERT INTO test_copy VALUES(7, '"');
    INSERT 0 1
    
    db1=#  SELECT * FROM test_copy;
     id |   name    
    ----+-----------
      1 | aaa
      2 | bb       +
        | b
      3 | cc      c
        | ddd
      5 | ee\e
      6 | ,
      7 | "
    (7 rows)
    

  2. 整表数据导出。

    1
    2
    3
    4
    5
    6
    7
    db1=# COPY test_copy TO '/home/xy/test.csv' 
        DELIMITER ',' 
        QUOTE '"' 
        ESCAPE '"' 
        ENCODING 'UTF-8' 
        CSV;
    COPY 7
    

    导出的CSV文件内容如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    1,aaa
    2,"bb
    b"
    3,cc	c
    ,ddd
    5,ee\e
    6,","
    7,""""
    

  3. 数据导入。

    db1=# TRUNCATE test_copy;
    TRUNCATE TABLE
    
    db1=# COPY test_copy FROM '/home/xy/test.csv' 
        DELIMITER ',' 
        QUOTE '"' 
        ESCAPE '"' 
        ENCODING 'UTF-8' 
        CSV;
    COPY 7

  4. 自定义数据集导出:导出test_copy中id不为空所有行的name列。

    1
    2
    3
    4
    5
    6
    7
    8
    db1=# COPY (SELECT name FROM test_copy WHERE id IS NOT NULL) 
        TO '/home/xy/test.csv' 
        DELIMITER ',' 
        QUOTE '"' 
        ESCAPE '"' 
        ENCODING 'UTF-8' 
        CSV;
    COPY 6
    

    导出的CSV文件内容如下所示:

    1
    2
    3
    4
    5
    6
    7
    aaa
    "bb
    b"
    cc	c
    ee\e
    ","
    """"