SQL Server迁移至RedShift出现无效UTF8错误3的问题咨询
RedShift隐式类型转换规则说明
支持的隐式转换范围
- 数值类型间:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL之间可自动向上兼容转换,例如INT转BIGINT、DECIMAL转FLOAT等,向下转换需显式执行避免精度丢失
- 字符类型间:CHAR、VARCHAR、CHARACTER VARYING之间可自动转换,长度不足时自动截断
- 日期时间类型间:DATE、TIME、TIMESTAMP、TIMESTAMPTZ之间可根据格式自动转换,符合字符串格式的字符类型也可隐式转日期时间类型
- 其他兼容转换:BOOLEAN可隐式转数值(1/0)、字符串(true/false),数值/符合格式的字符串也可隐式转BOOLEAN
varchar到super的隐式转换支持情况
RedShift 不支持varchar到super类型的隐式转换,所有varchar转super的操作必须显式调用JSON_PARSE()函数完成,且只有待转换的varchar内容符合JSON格式规范时,转换才能成功。UNC路径字符串不符合JSON格式要求,即使执行显式转换也无法正常完成。
UTF8编码报错解决方案
报错原因:源端SQL Server的varchar(max)字段默认使用非UTF8编码(通常为SQL_Latin1_General_CP1_CI_AS等拉丁语系/GBK编码),其中包含的0xbe等字节不属于UTF8合法编码范围,和字段内的GUID内容无关联。
22021: String contains invalid or unsupported UTF8 codepoints. Bad UTF8 hex sequence: be (error 3)
可按以下优先级排查解决:
- 迁移前在SSIS源端查询时做编码转换:源端查询语句中对该varchar(max)字段调用
CONVERT(NVARCHAR(MAX), 目标字段名),先转成SQL Server端的Unicode编码,再同步到RedShift - RedShift端目标表对应字段设置为
VARCHAR(MAX),接收转换后的Unicode字符串 - 若仍存在非法编码字符,可在RedShift端写入前调用
CONVERT_TO_UTF8(目标字段名, 'ISO-8859-1')(根据源端实际编码替换第二个参数)清洗非法字符,也可使用ASCII(目标字段名)逐行排查包含非法字节的记录 - 特殊场景下可在SSIS中添加脚本转换组件,对该字段的字节流做UTF8转码过滤,剔除不兼容的字节序列后再写入RedShift
内容的提问来源于stack exchange,提问作者Kahlil C Mazema
相关产品推荐
相关产品推荐

