Oracle中regexp_replace未过滤变音字符是否为排序规则问题
问题成因
Oracle正则表达式的范围匹配规则默认受会话的NLS_SORT排序规则控制,而非直接按ASCII码值判定,这是导致问题的核心原因:
- 当前你的会话
NLS_SORT为German,德语排序规则里,ä、ü、Ø这类德语变体字符被归入a-z/A-Z的字母排序区间,因此会被[a-zA-Z]规则命中,你写的排除规则[^a-zA-Z0-9]自然不会移除这些字符。 - 你之前排除排序规则影响的测试逻辑不对应正则的匹配场景:
decode走的是严格的字符全等二进制比较,ü和u本身编码不同,所以返回1,这个结果不能证明排序规则没有作用。- 三个大小比较返回1,仅能说明在德语排序规则下
ü的排序位置在z、Z、9之后,这和它属于a-z范围并不冲突:德语排序逻辑中,ä紧跟a、ö紧跟o、ü紧跟u,都属于a到z的覆盖区间。
修复方案
如果需要严格按ASCII规则匹配,仅保留ASCII大小写字母和数字,给regexp_replace增加最后一个匹配参数'c',强制按二进制值匹配即可,不受NLS规则影响:
select regexp_replace('ABcdäü~~~--- Ø asdsad 123 /() ´´´', '[^a-zA-Z0-9]', '', 1, 0, 'c') x from dual;
运行后会返回预期结果:ABcdasdsad123
内容的提问来源于stack exchange,提问作者Peter Frey
相关产品推荐
相关产品推荐

