簡體   English   中英

Oracle REGEXP_INSTR()和“ az”字符范圍與預期不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM