| 維度 | Java substring(begin, end) | Oracle substr(str, begin, len) |
|---|---|---|
| 參數含義 | 起始索引、結束索引(不含) | 字串、起始位置、長度 |
| 索引起始 | 0 | 1 |
| 返回長度 | end - begin | 第三參數 len |
| 越界行為 | 拋 StringIndexOutOfBoundsException | 靜默截取至字串末尾 |
| 負數索引 | 不支援 | 支援:-1 表示倒數第 1 字元 |
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)char[],改為複製,避免記憶體洩漏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" 省略長度=取至末尾
substrb 參數與 substr 相同,但**按字節計算**,適用於多位元組字符集(如 UTF-8、AL32UTF8)。
SELECT substr('我們都是好孩子', 3, 4) FROM dual; -- "都是好孩" 按字符
SELECT substrb('我們都是好孩子', 3, 4) FROM dual; -- "們都" 按字節
SELECT substrb('我們都是好孩子', 4, 4) FROM dual; -- " 都 " 字節邊界對齊規則
英文字符集下 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) |
substring O(1) (JDK 6) → O(N) 複製 (JDK 7+),長字串頻繁截取注意 GC 壓力。substr 在 SQL 中執行,避免網路傳輸全字串,大數據量優先在資料庫端截取。Java substring 採用「零基礎、左閉右開」區間語義;Oracle substr 採用「一基礎、起始+長度」語義並支援負索引。跨語言開發時務必建立統一工具類封裝,避免 Off-by-one 錯誤。涉及中文字節截取時,Java 需手動編碼轉換,Oracle 直接用 substrb,但須理解字節邊界對齊規則。