首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle VARCHAR2 中文長度陷阱:UTF8 字符集下一字佔三位元組

     編輯:Oracle 資料庫相關知識

問題現象

DECLARE
  abc VARCHAR2(4000);
BEGIN
  INSERT INTO table_name(abc) VALUES ('這裡有1500個漢字...');
  -- 報錯:ORA-12899: value too large for column
END;

測試發現:UTF8 字符集下,一個中文字佔 3 位元組,1500 字需 4500 位元組,超過 4000 限制。

根因確認

SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
-- 回傳 AL32UTF8 或 UTF8

AL32UTF8(Unicode UTF-8)中文佔 3 位元組;ZHS16GBK 中文佔 2 位元組。

解決方案:調整字符集為 ZHS16GBK

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET ZHS16GBK;
-- 如有國家字符集同步修改
ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK;
SHUTDOWN IMMEDIATE;
STARTUP;

重要提醒

  • 字符集修改屬高風險操作,必須先完整備份。
  • 僅支援「子集 → 超集」方向(如 US7ASCII → ZHS16GBK),ZHS16GBK 與 ZHS16CGB231280 無包含關係,理論不支援互轉(實務常可強制但風險自負)。
  • 新建資料庫時直接指定 CHARACTER SET ZHS16GBK 避免後續麻煩。
  • 12c+ 支援 MAX_STRING_SIZE = EXTENDED 將 VARCHAR2 上限擴至 32767 位元組,可緩解但不解決字符集本質問題。

小結

UTF8 字符集下中文佔 3 位元組是導致 VARCHAR2(4000) 存不下 1500 中文字的根本原因。生產環境建議採用 ZHS16GBK 或規劃足夠長度;字符集變更需謹慎評估與完整備份。

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