新聞發布系統中 newsCon VARCHAR2(8000) 欄位,資料庫直接插入正常,但網頁修改標題(未改內容)卻拋出「值過大」異常。
字元編碼與位元組長度不匹配:
VARCHAR2(8000) 預設單位為位元組(除非指定 CHAR 語意)。AL32UTF8,一個中文字佔 3 位元組,8000 位元組僅能存約 2666 個中文字。<→<),導致位元組長度暴增超過 8000 限制。-- 檢查實際位元組長度
SELECT LENGTHB(newsCon) FROM news_table WHERE id = :id;
-- 檢查字元集
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';
ALTER TABLE news_table MODIFY newsCon CLOB;
CLOB 無 4000 位元組限制,適合新聞內文,效能現代 Oracle 版本已優化。
ALTER TABLE news_table MODIFY newsCon VARCHAR2(8000 CHAR);
改以字元數計算長度,8000 個中文字無壓力。需確認應用端同樣以字元邏輯驗證。
在網頁儲存前,以資料庫字元集計算位元組長度並截斷:
// Java 範例
byte[] bytes = content.getBytes("UTF-8"); // 或資料庫實際字元集
if (bytes.length > 8000) content = new String(Arrays.copyOf(bytes, 8000), "UTF-8");
CLOB 或 VARCHAR2(n CHAR)。理解「字元 vs 位元組」與「資料庫 vs 應用編碼」的差異,是解決此類長度異常的關鍵。