Oracle中[:punct:]字符类匹配英镑符号£的原因是什么?
问题原因说明
你遇到的这个匹配结果是Oracle正则字符类和字符集、区域规则绑定的特性导致的,具体原因如下:
- Oracle的
[:punct:]字符类匹配范围并非固定为ASCII标点,它的判定逻辑完全依赖数据库的NLS_CHARACTERSET字符集配置和NLS_SORT排序/区域规则。 - 目前大部分生产环境Oracle使用的AL32UTF8字符集,以及常见的西欧字符集(如WE8MSWIN1252)的默认规则中,£符号被归入了标点/符号分类,因此会被
[:punct:]匹配命中,这是符合Oracle官方正则实现规则的,不属于异常。 - 如果你的业务需要严格仅匹配ASCII范围内的标点,建议放弃
[:punct:],手动枚举需要支持的ASCII标点列表,比如将正则修改为:
修改后£就不会被匹配,符合你的预期结果。select 'x' from dual where regexp_like('regex1,£','^[a-zA-Z0-9!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~]+$');
你也可以执行以下SQL确认当前数据库的字符集:select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
如果返回结果为AL32UTF8或者西欧类字符集,就会出现你反馈的匹配现象。
内容的提问来源于stack exchange,提问作者user2893601
相关产品推荐
相关产品推荐

