本文以 Oracle12c 為例
1.主要區別對比
類型 | 存儲方式 | 最大長度 | 字符集支持 | 適用場景 | 備注 |
---|---|---|---|---|---|
?CHAR(M) | 固定長度+空格填充 | 2000 字節,M 代表字節長度 | 默認字符集 | 固定長度編碼 | 實際存儲長度固定為定義長度(如 CHAR(10) 始終占 10 字節) |
?VARCHAR2(M) | 可變長度 | 4000 字節,M 默認代表字節長度 | 默認字符集 | 可變長度文本 | 標準模式下最大為 4000 字節,擴展模式可到 32767 字節(需手動啟用) |
?NCHAR(M) | 固定長度+空格填充 | 2000 字符,M 代表字符長度 | 國家字符集 | 多語言固定長度文本 | M 支持的長度受字符集影響 |
?NVARCHAR2(M) | 可變長度 | 4000 字節,M 代表字符長度 | 國家字符集 | 多語言可變長度文本 | M 支持的長度受字符集影響 |
?CLOB | 大文本 | 4GB | 數默認字符集 | 超大單字節文本(如日志、XML) | 實際存儲受表空間和數據塊限制 |
?NCLOB | 大文本 | 4GB | 國家字符集 | 超大多語言文本 | 實際存儲受表空間和數據塊限制 |
VARCHAR 類型在 Oracle 中支持有限,不建議使用。
類型前綴為 “N” 代表使用的是國家字符集,且字符存儲時采用 Unicode,且在多語言情況下相同字符所需的存儲空間可能更小。
類型前綴不帶 “N” 代表采用數據庫默認的字符集,可能會導致字符存儲時不采用 Unicode 編碼方式。但一般數據庫默認的字符集都是 UTF8 類型的。因此一般用不帶 “N” 的類型就可以了。
前綴帶 “N” 的類型長度 M 代表的都是字符長度,不帶 “N” 的類型長度 M 默認都是指字節長度。
查看當前數據庫默認字符集和國家字符集的方式如下:
-- 查看數據庫字符集(默認字符集)、國家字符集
SELECT *
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
輸出為:
可以看到此時默認字符集為 AL32UTF8,國家字符集為 AL16UTF16。
?數據庫默認字符集:
- AL32UTF8:Unicode UTF-8(Unicode 5.0+(新標準))。
- ZHS16GBK:簡體中文 GBK 編碼。
- WE8MSWIN1252:西歐字符集。
?國家字符集:
- AL16UTF16:Unicode UTF-16。
- UTF8:Unicode UTF-8(Unicode 3.1(舊標準))。
2.補充
上文提到,字符類型長度 M 能指定的最大值與數據集相關。比如在多字節字符集(如 AL16UTF16),建表時用 NVARCHAR2(4000) 會報錯,可能原因是超過了最大字節長度 4000。
此外,M 能指定的最大長度還與“數據庫塊大小(默認 8KB)”、“數據庫是否開啟擴展模式” 等因素有關。
-- 查看塊大小
SELECT value AS "塊大小 (字節)"
FROM v$parameter
WHERE name = 'db_block_size';-- 查看擴展模式
SELECT value AS "擴展模式"
FROM v$parameter
WHERE name = 'max_string_size';