Oracle 數據類型比較規則


數值

較大的值被認為大於較小的值。所有負數都小於零,所有正數都小於零。因此,-1小於100;-100小於-1。

浮點值NaN(not a number))大於任何其他數值,且等於自身。

日期時間值

較遲的日期或時間戳被認為大於較早的日期或時間戳。例如,等價於 '29-MAR-2005' 的日期小於 '05-JAN-2006' ,等價於 '05-JAN-2006 1:35pm'的時間戳大於 '05-JAN-2005 10:09am'。

當比較兩個帶有時區的時間戳時,它們首先被標准化為UTC,即時區偏移量“+00:00”。例如,時區等於 '16-OCT-2016 05:59am Europe/Warsaw' 的時間戳等於

'15-OCT-2016 08:59pm US/Pacific'。兩者代表相同的絕對時間點,用UTC表示的時間是 October 16th, 2016, 03:59am 。

二進制值

數據類型raw或blob的二進制值是一個字節序列。當比較兩個二進制值時,依次比較兩個字節序列的相應連續字節。如果兩個比較值的第一個字節不同,則包含數值較低的字節的二進制值被認為較小。如果第一個字節相等,則類似地比較第二個字節,依此類推,直到比較的字節不同或比較過程到達其中一個字節的值末尾。在后一種情況下,較短的值被認為較小。

無法在比較條件下直接比較數據類型BLOB的二進制值。但是,它們可以通過 PL/SQL 函數DBMS_LOB.COMPARE進行比較。

字符值

字符值基於兩個度量進行比較:

  • 二進制或語言排序
  • 空白填充或非填充的比較語義

下面的小節描述了這兩個度量。

二進制和語言排序

在默認的二進制排序規則中,Oracle比較字符值像二進制值一樣。構成存儲字符集中兩個字符值編碼的兩個字節序列被視為二進制值,並按照二進制值中的描述進行比較。此比較的結果返回源字符值的二進制比較的結果。

對於許多語言,二進制排序規則可能會產生語言上不正確的字符值排序。例如,在最常見的字符集中,所有大寫拉丁字母的字符代碼的值都低於所有小寫拉丁字母的值。因此,二進制排序規則生成以下順序:

MacDonald
MacIntosh
Macdonald
Macintosh

但是,大多數用戶希望按以下順序顯示這四個值:

MacDonald
Macdonald
MacIntosh
Macintosh

這表明二進制排序規則可能不適用於英文字符值。

Oracle數據庫支持根據各種語言的規則對字符串進行語言排序。它還支持匹配字符值 case- 和 accent-insensitively的排序規則變體。語言排序比較昂貴,但它們提供了優越的用戶體驗。

語言排序的限制

比較條件、 ORDER BY, GROUP BY 和 MATCH_RECOGNIZE 查詢子句、COUNT(DISTINCT) 和統計聚合函數 、LIKE 條件、以及 ORDER BY 和PARTITION BY分析子句在使用語言排序時生成排序鍵。

排序鍵與函數NLSSORT 返回的值相同,並且受 NLSSORT 中描述的相同限制的約束。

空白填充或非填充的比較語義

使用空白填充語義,如果這兩個值的長度不同,那么Oracle首先在較短值的末尾添加空白,以使它們的長度相等。然后,Oracle逐字符比較值,直到第一個不同的字符。在第一個不同位置具有較大字符的值被認為較大。如果兩個值沒有不同的字符,則認為它們相等。這條規則意味着,如果兩個值僅末尾空格數不同,那么它們是相等的。只有當比較的表達式中的兩個值都是數據類型 CHAR,、NCHAR、文本或 USER 函數返回的值時,Oracle才使用空白填充的比較語義。

使用非填充語義,Oracle將兩個值逐字符比較,直到第一個不同的字符。在該位置具有較大字符的值被認為較大。如果兩個不同長度的值在較短值的末尾相同,則較長的值被認為較大。如果兩個長度相等的值沒有不同的字符,則認為這些值相等。當比較中的一個或兩個值的數據類型為 VARCHAR2 or NVARCHAR2.時,Oracle使用非填充的比較語義。

使用不同的比較語義比較兩個字符值的結果可能會有所不同。下表顯示了使用每個比較語義比較五對字符值的結果。通常,空白填充和非填充比較的結果是相同的。表中的最后一個比較說明了空白填充和非填充比較語義之間的差異。

Blank-Padded

Nonpadded
'ac' > 'ab' 'ac' > 'ab'
'ab' > 'a '  'ab' > 'a '
'ab' > 'a'  'ab' > 'a'
'ab' = 'ab'  'ab' = 'ab'
'a ' = 'a'  'a ' > 'a'

數據綁定排序

從 Oracle Database 12c Release 2 (12.2)開始,比較或匹配給定字符值時使用的排序規則與該值本身關聯。它被稱為數據綁定排序。可以將數據綁定排序視為值的數據類型的屬性。

在先前的Oracle數據庫版本中,會話參數 NLS_COMP 和 NLS_SORT粗略地確定了數據庫會話中所有排序規則敏感的SQL操作的排序規則。數據綁定排序體系結構使應用程序能夠一致地將特定於語言的比較規則應用於需要這些規則的數據。

Oracle Database 12c Release 2 (12.2)允許聲明表列的排序規則。當列作為參數傳遞給排序規則敏感的SQL操作時,SQL操作使用該列聲明的排序規則來處理該列的值。如果SQL操作有多個相互比較的字符參數,排序規則確定規則將確定要使用的排序規則。

有兩種類型的數據綁定排序規則:

  • 命名排序:這是一個由指定了排序名稱的排序規則組成的特殊集合。“排序規則排序規則是一樣的,都是specified AS值的參數nls _黑色。一個名叫collation可以或者A或A BINARY collation collation的語言。命名排序規則與指定為nls_sort參數值的排序規則相同。命名排序規則可以是二進制排序規則,也可以是語言排序規則。
  • 偽排序:這種排序不是為SQL操作直接指定排序規則。相反,它指示操作檢查會話參數nls_sort和nls_comp的值,以便使用實際命名的排序規則。偽排序是指定排序的新聲明方法與使用會話參數的舊方法之間的橋梁。特別是,使用 USING_NLS_COMP 的偽排序規則指導SQL操作的行為與Oracle Database 12c Release 2 之前的行為完全相同。 

為列聲明命名排序規則時,將靜態確定列值的比較方式。聲明偽排序規則時,可以使用會話參數nls_comp和nls_sort動態控制比較行為。但是,在用偽排序規則聲明的列上定義的靜態對象(如索引和約束)會返回到使用二進制排序規則。動態可設置的排序規則不能用於比較靜態對象的值。

表達式中使用的字符文本或綁定變量的排序規則是從包含表達式的數據庫對象的默認排序規則派生,例如視圖或物化視圖查詢、PL/SQL存儲單元代碼、用戶定義的類型方法代碼,或獨立的DML或查詢語句。在Oracle Database 12c Release 2中,pl/sql存儲單元的默認排序規則,用戶定義的類型方法和獨立的SQL語句總是使用 USING_NLS_COMP的偽排序規則。視圖和物化視圖的默認排序規則可以在CREATE VIEW 和 CREATE MATERIALIZED VIEW 聲明的DEFAULT COLLATION子句中指定。

如果SQL操作返回字符值,則排序規則派生規則將確定結果的派生排序,以便在將結果作為參數傳遞給表達式樹中另一個對排序規則敏感的SQL操作或頂級使用者(如SELECT語句中的SQL語句子句)時知道其排序規則。如果SQL操作對字符參數值進行操作,則其字符結果的派生排序規則基於參數的排序規則。否則,派生規則與字符文本相同。

可以使用 COLLATE 運算符重寫表達式節點的派生排序規則,例如簡單表達式或運算符結果。

Oracle數據庫允許為列、表或模式聲明不區分大小寫的排序規則,以便可以始終以不區分大小寫的方式比較表或模式中的列或所有字符列。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM