
# 如何实现DWS不同编码库之间数据容错导入
要实现从数据库A（UTF8编码）至数据库B（GBK编码）的数据导入，常规方法导入数据时会出现字符集编码不匹配的错误，导致数据无法导入。
针对小批量数据导入的场景，可以通过\\COPY命令来完成，具体方法如下：
1. 创建数据库A和B，其中数据库A的编码格式为UTF8，数据库B的编码格式为GBK。 
   ```
   postgres=> CREATE DATABASE A ENCODING 'UTF8' template = template0;
   postgres=> CREATE DATABASE B ENCODING 'GBK' template = template0;
   ```
   
   
2. 查看数据库列表，可以看到已经创建的数据库A和B。 
   ```
   postgres=> \l
                              List of databases
      Name    |  Owner  | Encoding  | Collate | Ctype | Access privileges
   -----------+---------+-----------+---------+-------+-------------------
    a         | dbadmin | UTF8      | C       | C     |
    b         | dbadmin | GBK       | C       | C     |
    gaussdb   | Ruby    | SQL_ASCII | C       | C     |
    postgres  | Ruby    | SQL_ASCII | C       | C     |
    template0 | Ruby    | SQL_ASCII | C       | C     | =c/Ruby          +
              |         |           |         |       | Ruby=CTc/Ruby
    template1 | Ruby    | SQL_ASCII | C       | C     | =c/Ruby          +
              |         |           |         |       | Ruby=CTc/Ruby
    xiaodi    | dbadmin | UTF8      | C       | C     |
   (7 rows)
   ```
   
   
3. 切换到数据库A，输入用户密码。创建表test01，并向表中插入数据。 
   ```
   postgres=> \c a
   Password for user dbadmin:
   SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128)
   You are now connected to database "a" as user "dbadmin".
   a=> CREATE TABLE test01
    (
        c_customer_sk             integer,
        c_customer_id             char(5),
        c_first_name              char(6),
        c_last_name               char(8)
    )
    with (orientation = column,compression=middle)
    distribute by hash (c_last_name);
   CREATE TABLE
   a=> INSERT INTO test01(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');
   INSERT 0 1
   a=> INSERT INTO test01 VALUES (456, 'good');
   INSERT 0 1
   ```
   
   
4. 使用\\COPY命令从utf8库中将数据以Unicode编码格式导出成文件test01.dat。 
   ```
   \copy test01 to '/opt/test01.dat' with (ENCODING 'Unicode');
   ```
   
   
5. 切换到数据库B，创建同名表test01。 
   ```
   a=> \c b
   Password for user dbadmin:
   SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128)
   You are now connected to database "b" as user "dbadmin".
   b=> CREATE TABLE test01
    (
        c_customer_sk             integer,
        c_customer_id             char(5),
        c_first_name              char(6),
        c_last_name               char(8)
    )
    with (orientation = column,compression=middle)
    distribute by hash (c_last_name);
   ```
   
   
6. 使用\\COPY命令将文件test01.dat导入到数据库B。 
   ```
   \copy test01 from '/opt/test01.dat' with (ENCODING 'Unicode' ,COMPATIBLE_ILLEGAL_CHARS 'true');
   ```
   ![](https://support.huaweicloud.com/dws_faq/public_sys-resources/note_3.0-zh-cn.png)
   - 容错性参数COMPATIBLE_ILLEGAL_CHARS指定导入时对非法字符进行容错处理，非法字符转换后入库。不报错，不中断导入。
   
   - 此参数不支持BINARY格式，会报"cannot specify bulkload compatibility options in BINARY mode"错误信息。
   
   - 此参数仅对COPY FROM导入有效。
    
   
   
7. 在数据库B里查看表test01中的数据。 
   ```
   b=> select * from test01;
    c_customer_sk | c_customer_id | c_first_name | c_last_name
   ---------------+---------------+--------------+-------------
             3769 | hello         | Grace        |
              456 | good          |              |
   (2 rows)
   ```
   
   
8. 通过以上操作就可完成将数据从数据库A（UTF8）至数据库B（GBK）的导入。
 
