
# 数据存在错误时的导出操作指南
对于导出时数据存在错误的原因，通常为将不满足数据库服务端编码的字符串或二进制数据插入到了数据库中，因此推荐在导出时保持客户端编码与数据库服务端编码保持一致，即可跳过服务端编码的合法性校验，也不会进行数据转码。
#### 导出编码一致性处理原则
1. 当客户端编码（client_encoding）与服务端编码（server_encoding）一致时：
   - 执行原生数据导出；
   
   - 保证数据完整性和原始性；
   
   - 无需进行字符集转换。
    
2. 当客户端编码（client_encoding）与服务端编码（server_encoding）不一致时：
   - 采用客户端编码作为导出文件目标编码标准；
   
   - 内核中对已有数据先基于服务端编码进行编码合法性校验，存在非法编码的数据会进行报错；
   
   - 内核再将数据进行转码处理，对无法转码（源字符集存在码位，目标字符集不存在码位）的字符进行报错。
    
 
#### 非法编码处理方案
当用户的数据库中存在非法编码入库的数据，想要导出时不进行报错，推荐以下两种方案。
首选方案：保持客户端编码与服务端编码保持一致后，将数据以数据库服务端编码进行导出，不进行转码。
1. 查询数据库服务端编码。 
   ```
   gaussdb=# SHOW server_encoding;
   ```
   
   
2. 查询数据库客户端编码。 
   ```
   gaussdb=# SHOW client_encoding;
   ```
   
   
3. 设置客户端编码与服务端编码一致。 
   ```
   gaussdb=# SET client_encoding = '{server_encoding}';
   ```
   
   
4. 执行COPY将数据以标准的CSV格式导出到文件中。 
   ```
   gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV;
   ```
   
   
次选方案：需要依赖数据库内核的转码能力，并对非法编码的字节通过占位符（'?'）进行替换，导出的数据内容会发生变化。
1. 查询数据库服务端编码。 
   ```
   gaussdb=# SHOW server_encoding;
   ```
   
   
2. 设置数据库客户端编码为目标编码。 
   ```
   gaussdb=# SET client_encoding = {target_encoding};
   ```
   
   
3. 依赖内核转码能力进行导出，将非法编码的字节进行替换。 
   ```
   gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV COMPATIBLE_ILLEGAL_CHARS;
   ```
   
   
 
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 使用COMPATIBLE_ILLEGAL_CHARS参数，当数据中存在非法编码的数据时，会将导出的数据进行修正，数据库内的数据不变，请酌情考虑后使用。
- 启用COMPATIBLE_ILLEGAL_CHARS参数的修改规则如下：
  - 非法字符替换：根据convert_illegal_char_mode参数配置的字符进行替换，默认替换为为'?'（U+003F）字符。
  
  - 零字符替换：对于零字符（U+0000）统一替换成空格字符（U+0020），如果不需要进行零字符替换，需要配置不同兼容性下的零字符功能开关。
   
- 关于[COMPATIBLE_ILLEGAL_CHAR....](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0531.html#ZH-CN_TOPIC_0000002527826192__zh-cn_topic_0000002526895770_li179613271195)参数的具体使用约束，请参考COPY语法章节。
 
