云服务器内容精选

  • 总结 智能修正模式与严格校验模式可以结合使用,且智能修正模式具有优先级。在进行COPY导入时,若已明确指定对数据异常采用智能修正,那么该行数据的处理将不会触发严格校验模式。这意味着错误表不会记录相应数据,同时也不会扣除reject limit次数。建议用户根据自身实际情况,权衡是否自动修正列异常与字符异常后入库,还是直接舍弃。 对于严格校验模式的两个级别,推荐用户默认选择Level1。这是因为Level1所支持的错误类型较为常见,并且不会对导入性能产生任何影响。而Level2目前仅在集中式A兼容环境下支持,开启该特性会额外消耗导入性能和内存资源。具体信息请参见COPY支持约束冲突容错能力。因此,不建议用户默认使用Level2,仅在明确数据存在约束类型冲突时再开启。
  • 典型场景使用示例 针对独立零字符的基础处理逻辑相对简单,本文重点展示复合型异常场景的解决方案,即数据流中同时存在零字符(\0)与非法编码字符的容错处理过程: 构造UTF8的零字符与非法字符数据。 gaussdb=# create database db_utf8 encoding='UTF-8' LC_COLLATE='en_US.UTF-8' LC_CTYPE ='en_US.UTF-8' dbcompatibility = 'A'; CREATE DATABASE gaussdb=# \c db_utf8 Non-SSL connection (SSL connection is recommended when requiring high-security) You are now connected to database "db_utf8" as user "omm". db_utf8=# create table test_encodings(id int, content text); CREATE TABLE db_utf8=# insert into test_encodings values(1, dbe_raw.cast_to_varchar2(dbe_raw.concat(dbe_raw.cast_from_varchar2_to_raw('导入'), hextoraw('00'), dbe_raw.cast_from_varchar2_to_raw('导出')))); INSERT 0 1 db_utf8=# insert into test_encodings values(2, dbe_raw.cast_to_varchar2(dbe_raw.concat(hextoraw('2297'), dbe_raw.cast_from_varchar2_to_raw('导入导出')))); INSERT 0 1 db_utf8=# show client_encoding; client_encoding ----------------- UTF8 (1 row) --在id为1的行中,content包含零字符;在id为2的行中,content含有不属于UTF-8字符集的字符。 db_utf8=# select *, dbe_raw.cast_from_varchar2_to_raw(content) from test_encodings; id | content | cast_from_varchar2_to_raw ----+-----------+------------------------------ 1 | 导入 | E5AFBCE585A500E5AFBCE587BA 2 | "导入导出 | 2297E5AFBCE585A5E5AFBCE587BA (2 rows) 在导出文件时,若选择与服务端相同的字符集,无需进行转码操作,文件默认能够顺利导出。然而,当选择与服务端不同的字符集时,则需要进行转码处理。在转码过程中,一旦识别到UTF-8编码中的非法字符0x97,系统将报错。此时,只需开启compatible_illegal_chars参数,文件便可成功导出。 db_utf8=# copy test_encodings to '/home/xy/encodings.txt.utf8' encoding 'utf-8'; COPY 2 db_utf8=# copy test_encodings to '/home/xy/encodings.txt.gb18030' encoding 'gb18030'; ERROR: invalid byte sequence for encoding "UTF8": 0x97 db_utf8=# copy test_encodings to '/home/xy/encodings.txt.gb18030' encoding 'gb18030' compatible_illegal_chars; COPY 2 使用UTF-8编码打开文件/home/xy/encodings.txt.utf8,当前示例未针对A进行兼容处理,且未开启support_zero_character选项和compatible_illegal_chars参数。以下结果显示:第一行第二列的数据被截断;第二行第二列存在乱码,虽然在显示上未呈现明显异常,但通过hexdump命令可查看出乱码数据。用户可参考此示例进行复现操作,具体数据在此不再详述。 1 导入 2 "导入导出 使用gb18030编码打开文件/home/xy/encodings.txt.gb18030,以下结果表明:文件中第一行第二列的零字符被替换为空格;第二行第二列的非法字符被替换为“?”。 1 导入 导出 2 "?导入导出
  • 导出编码一致性处理原则 当客户端编码(client_encoding)与服务端编码(server_encoding)一致时: 执行原生数据导出; 保证数据完整性和原始性; 无需进行字符集转换。 当客户端编码(client_encoding)与服务端编码(server_encoding)不一致时: 采用客户端编码作为导出文件目标编码标准; 内核中对已有数据先基于服务端编码进行编码合法性校验,存在非法编码的数据会进行报错; 内核再将数据进行转码处理,对无法转码(源字符集存在码位,目标字符集不存在码位)的字符进行报错。
  • 非法编码处理方案 当用户的数据库中存在非法编码入库的数据,想要导出时不进行报错,推荐以下两种方案。 首选方案:保持客户端编码与服务端编码保持一致后,将数据以数据库服务端编码进行导出,不进行转码。 查询数据库服务端编码 gaussdb=# show server_encoding; 查询数据库客户端编码 gaussdb=# show client_encoding; 设置客户端编码与服务端编码一致 gaussdb=# set client_encoding = '{server_encoding}'; 执行COPY将数据以标准的 CS V格式导出到文件中 gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV; 次选方案:需要依赖数据库内核的转码能力,并对非法编码的字节通过占位符('?')进行替换,导出的数据内容会发生变化。 查询数据库服务端编码。 gaussdb=# show server_encoding; 设置数据库客户端编码为目标编码。 gaussdb=# set client_encoding = {target_encoding}; 依赖内核转码能力进行导出,将非法编码的字节进行替换。 gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV COMPATIBLE_ILLEGAL_CHARS;
  • 严格校验模式(精准入库) 处理原则:以数据准确性优先,确保入库数据的绝对合规性。 适用场景:在医疗记录、金融交易等对数据精度要求极高的领域,若担心智能修正模式在导入数据时自动修正会影响数据准确性,可采用此模式。 处理流程: 执行多级校验(列数异常、字符异常、数据类型转换异常及约束冲突异常)。 生成错误诊断报告(含行号、错误类型、错误数据)。 建立错误数据隔离区。 仅通过校验的原始数据直接入库。 输出结果:纯净数据集以及错误明细报告(通过gs_copy_error_log与gs_copy_summary查看)。 容错级别:适用于智能修正模式处理的所有异常,如多列、缺列、废弃列、数据类型转换错误、字段超长、转码异常等。具体使用方法如下: 1 2 3 4 --当导入数据过程中出现数据类型错误的次数不超过 100 次时,导入不会报错,会继续导入下一行。若超过 100 次,则正常报错。错误数据的详情及行号会记录在gs_copy_error_log表中。 gaussdb=# COPY test_copy FROM '/home/omm/temp/test.csv' log errors reject LIMIT '100' CSV; --相较于上条语句,下面这条会在gs_copy_error_log中额外记录错误行的完整数据,在无数据安全风险的场景下推荐使用。该语句需要系统管理员权限。 gaussdb=# copy test_copy from '/home/omm/temp/test.csv' log errors data reject limit '100' csv;
  • 导出编码一致性处理原则 当客户端编码(client_encoding)与服务端编码(server_encoding)一致时: 执行原生数据导出; 保证数据完整性和原始性; 无需进行字符集转换。 当客户端编码(client_encoding)与服务端编码(server_encoding)不一致时: 采用客户端编码作为导出文件目标编码标准; 内核中对已有数据先基于服务端编码进行编码合法性校验,存在非法编码的数据会进行报错; 内核再将数据进行转码处理,对无法转码(源字符集存在码位,目标字符集不存在码位)的字符进行报错。
  • 非法编码处理方案 当用户的数据库中存在非法编码入库的数据,想要导出时不进行报错,推荐以下两种方案。 首选方案:保持客户端编码与服务端编码保持一致后,将数据以数据库服务端编码进行导出,不进行转码。 查询数据库服务端编码。 gaussdb=# SHOW server_encoding; 查询数据库客户端编码。 gaussdb=# SHOW client_encoding; 设置客户端编码与服务端编码一致。 gaussdb=# SET client_encoding = '{server_encoding}'; 执行COPY将数据以标准的CSV格式导出到文件中。 gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV; 次选方案:需要依赖数据库内核的转码能力,并对非法编码的字节通过占位符('?')进行替换,导出的数据内容会发生变化。 查询数据库服务端编码。 gaussdb=# SHOW server_encoding; 设置数据库客户端编码为目标编码。 gaussdb=# SET client_encoding = {target_encoding}; 依赖内核转码能力进行导出,将非法编码的字节进行替换。 gaussdb=# COPY test_copy TO '/data/test_copy.csv' CSV COMPATIBLE_ILLEGAL_CHARS;