3 回答

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
顯示差異的簡(jiǎn)單示例:
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對(duì)于總是固定字符長(zhǎng)度的表達(dá)式是有用的,例如美國(guó)州的郵政編碼,例如CA,NY,F(xiàn)L,TX

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是一個(gè)老線程,但它只是谷歌搜索'Oracle char vs varchar2'的頂部,雖然已經(jīng)有幾個(gè)答案正確描述了行為char
,但我認(rèn)為需要說(shuō)你不應(yīng)該使用它除外在兩種特定情況下:
您正在構(gòu)建固定長(zhǎng)度的文件或報(bào)告,并為a分配非null值,從而
char
避免了對(duì)rpad()
表達(dá)式進(jìn)行編碼的需要。例如,如果firstname
和lastname
都被定義為char(20)
,那么firstname || lastname
是一種較短的寫(xiě)作方式rpad(firstname,20) || rpad(lastname,20)
。您需要區(qū)分顯式空字符串
''
和null
。通常它們?cè)贠racle中是相同的,但是分配''
給一個(gè)char
值會(huì)觸發(fā)它的空白填充行為,而null
不是,所以如果說(shuō)出差異是很重要的,我真的不能想到它會(huì)出現(xiàn)原因的原因,那么你有辦法做到這一點(diǎn)。
實(shí)際上沒(méi)有理由char
因?yàn)槟承╅L(zhǎng)度是固定的(例如Y/N
標(biāo)志或ISO貨幣代碼等'USD'
)而使用。它不是更高效,它不節(jié)省空間(沒(méi)有神秘的長(zhǎng)度指示器varchar2
,只有一個(gè)空白的填充開(kāi)銷char
),并且它不會(huì)阻止任何人輸入更短的值。(如果你輸入'ZZ'
你的char(3)
貨幣欄,它就會(huì)被存儲(chǔ)為'ZZ '
。)它甚至不能與曾經(jīng)依賴它的某些古老版本的Oracle向后兼容,因?yàn)樗鼜膩?lái)沒(méi)有。
傳染病可以傳播,因?yàn)椋ò凑兆罴褜?shí)踐),您可以使用類似的東西錨定變量聲明sales.currency%type
。現(xiàn)在你的l_sale_currency
變量是一個(gè)秘密char
,它會(huì)為更短的值(或''
)進(jìn)行無(wú)形填空,即使你已經(jīng)分配給它們兩個(gè),也會(huì)打開(kāi)隱藏在l_sale_currency
不相等的錯(cuò)誤的大門(mén)。l_refund_currency
'ZZ'
CHAR
我確信,在Oracle 6中引入了ANSI兼容性原因。可能有潛在的客戶決定購(gòu)買(mǎi)哪個(gè)數(shù)據(jù)庫(kù)產(chǎn)品,并且ANSI兼容性在他們的核對(duì)表上(或者當(dāng)時(shí)是在那時(shí)),并且CHAR
在ANSI標(biāo)準(zhǔn)中定義了空白填充,因此Oracle需要提供它。你不應(yīng)該真正使用它。
添加回答
舉報(bào)