AWS DMS迁移Oracle到Redshift时单引号转省略号问题求助
问题原因分析
- 特殊字符替换引发长度膨胀:Oracle内容中的智能单引号(
’,Unicode U+2019)为单个字符,但AWS DMS迁移时未正确识别该特殊字符,将其替换为三个ASCII字符(...),导致原39字符的内容变为41字符,超出Redshift字段40字符的限制。 - 字符集配置不匹配:若Oracle与Redshift的字符集不一致(比如Oracle用AL32UTF8,Redshift未配置为UTF8),DMS无法正确映射特殊字符,触发默认的字符替换逻辑。
- 无效的转换规则配置:仅将字段改为
string并未解决字符替换或长度适配的核心问题,属于错误的规则设置方向。
解决方法
1. 修正字符集映射配置
- 查询Oracle源库字符集:执行
SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';确认字符集(通常为AL32UTF8),确保Redshift集群字符集与之一致(推荐UTF8)。 - 在DMS任务的任务设置中,找到「字符集转换」选项,明确设置源字符集为Oracle的字符集,目标字符集为Redshift的UTF8,让DMS正确处理特殊字符转换,避免无意义替换。
2. 配置特殊字符定向替换规则
在DMS任务的转换规则中添加「替换字符」规则,将智能单引号替换为普通单引号(避免长度膨胀):
- 规则类型:
ReplaceCharacter - 匹配条件:指定目标表的
mid_nm字段 - 源字符:
U+2019(对应Oracle中的智能单引号) - 目标字符:
'(普通ASCII单引号)
3. 调整目标字段长度(兜底方案)
直接修改Redshift的mid_nm字段定义,预留足够字符空间:
ALTER TABLE your_table ALTER COLUMN mid_nm TYPE VARCHAR(50) ENCODE lzo;
此方案可快速解决溢出问题,但建议配合字符集配置从根源解决特殊字符转换问题。
4. 优化DMS错误处理策略(临时可选)
若需临时跳过长度溢出的记录,可在DMS任务设置中调整「错误处理」:
- 将「数据截断行为」设置为「截断并继续」,但此方案会丢失部分字符,仅适用于非核心字段的临时处理。
内容的提问来源于stack exchange,提问作者postgreshelp
相关产品推荐
相关产品推荐

