如何移除Oracle SQL查询结果中XML输出的Unicode特殊字符?
移除Oracle字符串中的Unicode特殊字符解决方案
从你提供的DUMP结果可以明确,字符串两侧的特殊字符是Unicode控制字符:
e2,80,ad对应 U+202D(从左到右覆盖)e2,80,ac对应 U+202C(弹出方向格式)
之前使用CHR(8237)和CHR(8236)替换失效,是因为Oracle的CHR函数在AL32UTF8字符集下,对大于255的十进制值处理逻辑依赖字符集转换,无法准确生成多字节Unicode字符。以下是几种可靠的解决方法:
方法1:使用UNISTR精准替换目标Unicode字符
UNISTR函数可以直接通过Unicode码点生成对应字符,在AL32UTF8环境下更可靠:
SELECT 'H' KEY, REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, UNISTR('\202D'), ''), UNISTR('\202C'), '') vendor_catalog_number FROM MyTable
方法2:正则表达式批量移除非打印控制字符
如果存在其他类似的Unicode控制字符,可通过正则表达式只保留可打印字符:
SELECT 'H' KEY, REGEXP_REPLACE(LN.VENDOR_PRODUCT_NUM, '[^[:print:]]', '') vendor_catalog_number FROM MyTable
如果只需要保留纯字母数字编号,可缩小匹配范围:
SELECT 'H' KEY, REGEXP_REPLACE(LN.VENDOR_PRODUCT_NUM, '[^A-Za-z0-9]', '') vendor_catalog_number FROM MyTable
方法3:基于UTF-8字节序列直接替换
已知目标字符的UTF-8十六进制编码,可通过RAW转换后替换:
SELECT 'H' KEY, UTL_RAW.CAST_TO_VARCHAR2( REPLACE(REPLACE(RAWTOHEX(LN.VENDOR_PRODUCT_NUM), 'E280AD', ''), 'E280AC', '') ) vendor_catalog_number FROM MyTable
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

