3 回答

TA貢獻1869條經驗 獲得超4個贊
顯示差異的簡單示例:
SELECT
'"'||CAST('abc' AS VARCHAR2(10))||'"',
'"'||CAST('abc' AS CHAR(10))||'"'
FROM dual;
'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc" "abc "
1 row selected.
CHAR對于總是固定字符長度的表達式是有用的,例如美國州的郵政編碼,例如CA,NY,FL,TX

TA貢獻1812條經驗 獲得超5個贊
這是一個老線程,但它只是谷歌搜索'Oracle char vs varchar2'的頂部,雖然已經有幾個答案正確描述了行為char
,但我認為需要說你不應該使用它除外在兩種特定情況下:
您正在構建固定長度的文件或報告,并為a分配非null值,從而
char
避免了對rpad()
表達式進行編碼的需要。例如,如果firstname
和lastname
都被定義為char(20)
,那么firstname || lastname
是一種較短的寫作方式rpad(firstname,20) || rpad(lastname,20)
。您需要區分顯式空字符串
''
和null
。通常它們在Oracle中是相同的,但是分配''
給一個char
值會觸發它的空白填充行為,而null
不是,所以如果說出差異是很重要的,我真的不能想到它會出現原因的原因,那么你有辦法做到這一點。
實際上沒有理由char
因為某些長度是固定的(例如Y/N
標志或ISO貨幣代碼等'USD'
)而使用。它不是更高效,它不節省空間(沒有神秘的長度指示器varchar2
,只有一個空白的填充開銷char
),并且它不會阻止任何人輸入更短的值。(如果你輸入'ZZ'
你的char(3)
貨幣欄,它就會被存儲為'ZZ '
。)它甚至不能與曾經依賴它的某些古老版本的Oracle向后兼容,因為它從來沒有。
傳染病可以傳播,因為(按照最佳實踐),您可以使用類似的東西錨定變量聲明sales.currency%type
。現在你的l_sale_currency
變量是一個秘密char
,它會為更短的值(或''
)進行無形填空,即使你已經分配給它們兩個,也會打開隱藏在l_sale_currency
不相等的錯誤的大門。l_refund_currency
'ZZ'
CHAR
我確信,在Oracle 6中引入了ANSI兼容性原因??赡苡袧撛诘目蛻魶Q定購買哪個數據庫產品,并且ANSI兼容性在他們的核對表上(或者當時是在那時),并且CHAR
在ANSI標準中定義了空白填充,因此Oracle需要提供它。你不應該真正使用它。
添加回答
舉報