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 位元組。
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;
ZHS16GBK 與 ZHS16CGB231280 無包含關係,理論不支援互轉(實務常可強制但風險自負)。CHARACTER SET ZHS16GBK 避免後續麻煩。MAX_STRING_SIZE = EXTENDED 將 VARCHAR2 上限擴至 32767 位元組,可緩解但不解決字符集本質問題。UTF8 字符集下中文佔 3 位元組是導致 VARCHAR2(4000) 存不下 1500 中文字的根本原因。生產環境建議採用 ZHS16GBK 或規劃足夠長度;字符集變更需謹慎評估與完整備份。