Java String.length() 計算字元數 (中英皆為 1),但 Oracle VARCHAR2 以位元組為單位,不同字元集中文佔用位元組數不同,導致插入時長度超限錯誤。
| 資料庫字元集 | 中文佔用位元組 | VARCHAR2(3) 可存中文字數 |
|---|---|---|
| WE8ISO8859P1 | 1 Byte | 3 字 |
| AL32UTF8 | 3 Bytes | 1 字 |
| ZHS16GBK | 2 Bytes | 1 字 (需定義 VARCHAR2(6) 才能存 3 字) |
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
SELECT LENGTH('測試') FROM DUAL; -- 2 (字元數)
SELECT LENGTHB('測試') FROM DUAL; -- 4 (位元組數,ZHS16GBK 環境)
SELECT LENGTH('cs') FROM DUAL; -- 2
SELECT LENGTHB('cs') FROM DUAL; -- 2
結論:定義 VARCHAR2 時需考慮字元集,VARCHAR2(n) 等同 VARCHAR2(n BYTE)。
string.getBytes(charset).length 計算位元組長度。LENGTHB 檢查並拋回錯誤。