You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 00:06:01