字串比較

字串比較有兩種不同類型。

二進位字串比較

二進位字串比較一律使用對照順序 *HEX ,並比較每一個字串的對應位元組。 此外,只有在兩個字串的長度相同時,兩個二進位字串才相等。 如果字串等於較短字串長度的上限,則即使較長字串中的剩餘位元組是十六進位零,也會將較短字串視為小於較長字串。 請注意,除非將字串強制轉型為二進位字串,否則無法將二進位字串與字串進行比較。

字元及圖形字串比較

對所有 SBCS 資料及混合資料的單位元組部分執行陳述式時,字元及 Unicode 圖形字串比較會使用有效的對照順序。 如果對照順序是 *HEX ,則會比較每一個字串的對應位元組。 對於所有其他對照順序,會比較每一個字串加權值的對應位元組。

如果字串具有不同的長度,則在比較之前,會在右側以空白填補較短字串的暫時副本。 填補會使每一個字串的長度相同。 無論對照順序為何,填補字元一律為空白。 對於位元資料,填補字元也是空白。 對於 DBCS 圖形資料,填補字元是 DBCS 空白 (x '4040')。 對於 Unicode 圖形資料,填補字元為 UTF-16 空白。 1

如果下列任何一項為真,則兩個字串相等:

  • 兩個字串都是空的。
  • 使用 *HEX 對照順序,且所有對應的位元組皆相等。
  • 使用 *HEX 以外的對照順序,且加權值的所有對應位元組皆相等。

空字串等於空白字串。 兩個不相等字串之間的關係是由字串左端的第一對不相等位元組 (或加權值的位元組) 的比較來決定。 此比較是根據執行陳述式時有效的對照順序來進行。

在將在多個環境中執行的應用程式中,必須使用相同的對照順序 (取決於環境的 CCSID) 來確保相同的結果。 下表說明 EBCDIC、ASCII 及 Db2® LUW 預設對照順序之間的差異,方法是顯示根據每一個清單排序的清單。

表 1. 對照順序差異
ASCII 和 Unicode EBCDIC Db2 LUW 預設值
0000 @@@@ 0000
9999 co-op 9999
@@@@ coop @@@@
COOP piano forte co-op
PIANO-FORTE piano-forte COOP
co-op COOP coop
coop PIANO-FORTE piano forte
piano forte 0000 PIANO-FORTE
piano-forte 9999 piano-forte

兩個具有不同長度的可變長度字串,如果它們僅在尾端空白的數目上不同,則它們是相等的。 在從這類值集中選取一個值的作業中,選取的值是任意的。 可能涉及此類任意選項的作業為 DISTINCT、MAX、MIN、UNION、EXCEPT、INTERSECT 及對分組直欄的參照。 如需分組直欄參照中涉及的任意選擇的相關資訊,請參閱 group-by-clause

比較的轉換規則:

當比較兩個字串時,必要的話,會先將其中一個字串轉換成另一個字串的編碼字集。 只有在符合下列所有條件時,才需要字元轉換:

  • 兩個字串的 CCSID 不同。
  • 這兩個 CCSID 都不是 65535。
  • 選取要轉換的字串不是空值,也不是空的。
  • 需要兩個 CCSID 之間的轉換。 如需相關資訊,請參閱 編碼字集及 CCSID

如果比較兩個具有不同編碼方法的字串,則任何必要的轉換都會套用至字串,如下所示:

表 2. 選取字元轉換的結果編碼方法
第一個運算元 第二個運算元
SBCS 資料 DBCS 資料 混合資料 Unicode 圖形資料
SBCS 資料 見下文
DBCS 資料 第一個 見下文
混合資料 第一個 第一個 見下文
Unicode 圖形資料 第一個 第一個 第一個 見下文

否則,選取要轉換的字串取決於每一個運算元的類型。 下表顯示在給定運算元類型的情況下,選取用於轉換的運算元:

表 3. 選取用於字元轉換的運算元
第一個運算元 第二個運算元
直欄值 衍生值 特殊暫存器 常數 變數
直欄值
衍生值 第一個
特殊暫存器 第一個 第一個
常數 第一個 第一個 第一個
變數 第一個 第一個 第一個 第一個

在任何作業中使用包含外部編碼方法中資料的變數之前,一律有效轉換為原生編碼方法。 上述規則基於已發生此轉換的假設。

如果無法轉換字串的字元,或未定義 CCSID 配對之間的轉換,則會傳回錯誤。 如需相關資訊,請參閱 編碼字集及 CCSID。 如果字串的字元轉換成替代字元,則會出現警告。

1 UTF-16 會在字碼點 X'0020 '及 X'3000' 定義空白字元。 資料庫管理程式會在字碼點 X'0020 ' 填補空白。