首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 中文長度陷阱:Java 與資料庫字元集差異導致的 VARCHAR2 定義與 LENGTH/LENGTHB 實測

     編輯:Oracle 教學

Oracle 中文長度陷阱分析

Java String.length() 計算字元數 (中英皆為 1),但 Oracle VARCHAR2 以位元組為單位,不同字元集中文佔用位元組數不同,導致插入時長度超限錯誤。

一、字元集與中文位元組數對照

資料庫字元集中文佔用位元組VARCHAR2(3) 可存中文字數
WE8ISO8859P11 Byte3 字
AL32UTF83 Bytes1 字
ZHS16GBK2 Bytes1 字 (需定義 VARCHAR2(6) 才能存 3 字)

二、查看目前字元集

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

三、LENGTH vs LENGTHB 實測

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)。

四、應用層驗證建議

  • Java 端驗證改用 string.getBytes(charset).length 計算位元組長度。
  • 或在資料庫層用 LENGTHB 檢查並拋回錯誤。
  • 統一使用 AL32UTF8 字元集可簡化多語系支援,但需預留 3 倍空間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved