[英]Oracle REGEXP_INSTR() and “a-z” character range doesn't match as expected
我想在Oracle數據庫中使用REGEXP_INSTR()
來檢查小寫/大寫字符。 我知道[:upper:]
和[:lower:]
POSIX字符類,但是我使用了az
,這給了我我不明白的真正奇怪的結果。 有人可以解釋嗎?
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
該行為的原因是排序規則。 請參閱NLS_SORT
文檔 :
- 如果該值為BINARY,則ORDER BY查詢的整理順序基於字符的數字值(需要較少系統開銷的二進制排序)。
- 如果該值是命名的語言排序,則排序基於定義的語言排序的順序。 NLS_LANGUAGE參數支持的大多數(但不是全部)語言也支持同名的語言排序。
將NLS_SORT
設置為BINARY
以便可以按與ASCII表相同的順序來解析[AZ]
,
alter session set nls_sort = 'BINARY'
然后,您將獲得一致的結果。
請參閱在線演示 。
好的,關於NLS_SORT
導致此行為的答案是正確的,但我認為它不能以一種可以理解的方式對其進行解釋。 我發現的任何文檔都沒有做到這一點...
您必須想象[az]
定義的字符范圍實際上是從所有可能的字符的單個子字符串派生的,這些子字符串根據NLS_SORT
進行排序。
假設整個字母只是字母數字字符。 按BINARY
排序后,將產生基本字符串,如0123456789abcdefgh...xyzABCDE...XYZ
。 由此得出, [0-6]
擴展為[0123456]
, [af]
[0-6]
擴展為[0123456]
[abcdef]
, [5-b]
擴展為[56789ab]
等。
但是,按linguistic_definition
排序會產生不同的基本字符串,例如0123456789aAbBcCdDeF...xXyYzZ
。 因此, [0-6]
仍擴展為[0123456]
,但[af]
現在擴展為[aAbBcCdDeEf]
, [5-b]
擴展為[56789aAb]
等。
這就是為什么a
不匹配[AZ]
,但是b
匹配的原因。 [AZ]
實際上擴展到[AbBcC...yYzZ]
其包括z
但不是a
。
實際上, [AZ]
甚至可能包含更多字符,例如[aAàáâÀÁÂ...]
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.