首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java substring 與 Oracle substr 差異詳解:索引起始、長度語義與 substrb 字節語義

     編輯:Java 相關知識

核心差異速查

維度Java substring(begin, end)Oracle substr(str, begin, len)
參數含義起始索引、結束索引(不含)字串、起始位置、長度
索引起始01
返回長度end - begin第三參數 len
越界行為拋 StringIndexOutOfBoundsException靜默截取至字串末尾
負數索引不支援支援:-1 表示倒數第 1 字元

Java substring 詳解

String s = "HelloWorld";
//        0123456789
System.out.println(s.substring(0, 5));  // "Hello"  [0,5)
System.out.println(s.substring(5));     // "World"  從 5 到結尾
System.out.println(s.substring(5, 10)); // "World"
  • substring(int beginIndex):從 beginIndex 到結尾
  • substring(int beginIndex, int endIndex):[beginIndex, endIndex)
  • Java 7+ 內部不再共享 char[],改為複製,避免記憶體洩漏

Oracle substr 詳解

SELECT substr('HelloWorld', 1, 5)  FROM dual;  -- "Hello"  從第1個取5個
SELECT substr('HelloWorld', 6, 5)  FROM dual;  -- "World"
SELECT substr('HelloWorld', -5, 5) FROM dual;  -- "World"  負數從末尾倒數
SELECT substr('HelloWorld', 3)     FROM dual;  -- "lloWorld" 省略長度=取至末尾

Oracle substrb:字節語義

substrb 參數與 substr 相同,但**按字節計算**,適用於多位元組字符集(如 UTF-8、AL32UTF8)。

中文環境測試 (假設字符集 UTF-8,中文佔 3 字節)

SELECT substr('我們都是好孩子', 3, 4)  FROM dual;  -- "都是好孩"  按字符
SELECT substrb('我們都是好孩子', 3, 4) FROM dual;  -- "們都"       按字節
SELECT substrb('我們都是好孩子', 4, 4) FROM dual;  -- " 都 "       字節邊界對齊規則

substrb 字節邊界規則

  • 起始位置落在字符**第一個字節** → 包含該字符
  • 起始位置落在字符**中間字節** → 忽略該字符,以空格佔位
  • 結束位置落在字符**最後字節** → 包含該字符
  • 結束位置落在字符**中間** → 以空格佔位

英文字符集下 substr 與 substrb 行為一致。

實務遷移建議

場景Java 寫法Oracle 寫法
取前 N 字符s.substring(0, n)substr(str, 1, n)
取後 N 字符s.substring(s.length()-n)substr(str, -n)
去首尾各 1 字符s.substring(1, s.length()-1)substr(str, 2, length(str)-2)
按字節截取 (中文)new String(s.getBytes("UTF-8"), 0, byteLen, "UTF-8")substrb(str, 1, byteLen)

效能提示

  • Java substring O(1) (JDK 6) → O(N) 複製 (JDK 7+),長字串頻繁截取注意 GC 壓力。
  • Oracle substr 在 SQL 中執行,避免網路傳輸全字串,大數據量優先在資料庫端截取。

總結

Java substring 採用「零基礎、左閉右開」區間語義;Oracle substr 採用「一基礎、起始+長度」語義並支援負索引。跨語言開發時務必建立統一工具類封裝,避免 Off-by-one 錯誤。涉及中文字節截取時,Java 需手動編碼轉換,Oracle 直接用 substrb,但須理解字節邊界對齊規則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved