首页 > 解决方案 > Oracle REGEXP_INSTR() 和“az”字符范围与预期不匹配

问题描述

我想REGEXP_INSTR()在 oracle 数据库中使用来检查小写/大写字符。我知道[:upper:][:lower:]POSIX 字符类,但我接受a-z它给了我非常奇怪的结果,我不明白。有人可以解释一下吗?

SELECT REGEXP_INSTR('abc','[A-Z]',1,1,0,'c') FROM DUAL
-- Got 2, expected 0

SELECT REGEXP_INSTR('zyx','[A-Z]',1,1,0,'c') FROM DUAL
-- Got 1, expected 0

SELECT REGEXP_INSTR('ABC','[a-z]',1,1,0,'c') FROM DUAL
-- Got 1, expected 0

SELECT REGEXP_INSTR('ZYX','[a-z]',1,1,0,'c') FROM DUAL
-- Got 2, expected 0

SELECT REGEXP_INSTR('a3','[A-F0-9]',1,1,0,'c') FROM DUAL
-- Got 2, expected 2

SELECT REGEXP_INSTR('b3','[A-F0-9]',1,1,0,'c') FROM DUAL
-- Got 1, expected 2

SELECT REGEXP_INSTR('b3','[A-F0-9]') FROM DUAL
-- Got 1, expected 1 or 2

SELECT REGEXP_INSTR('a3','[A-F0-9]') FROM DUAL
-- Got 2, expected same as above

标签: sqlregexoracle

解决方案


行为的原因是排序规则。请参阅NLS_SORT文档

  • 如果值为 BINARY,则 ORDER BY 查询的整理顺序基于字符的数值(需要较少系统开销的二进制排序)。
  • 如果该值是命名语言排序,则排序基于定义的语言排序的顺序。NLS_LANGUAGE 参数支持的大多数(但不是全部)语言也支持具有相同名称的语言排序。

将 设置NLS_SORTBINARY以便[A-Z]可以按照与 ASCII 表中相同的顺序进行解析,

alter session set nls_sort = 'BINARY'

然后,您将获得一致的结果。

请参阅在线演示


推荐阅读