Přestože již existuje několik odpovědí správně popisujících chování char
, Myslím, že je třeba říci, že by jste to neměli používat kromě tří specifických situací:
- Vytváříte soubor nebo sestavu s pevnou délkou a přiřazujete nenulovou hodnotu k
char
vyhýbá se nutnosti kódovatrpad()
výraz. Například pokudfirstname
alastname
jsou oba definovány jakochar(20)
, pakfirstname || lastname
je kratší způsob zápisurpad(firstname,20) || rpad(lastname,20)
vytvořitChuck Norris
. - Musíte rozlišovat mezi explicitním prázdným řetězcem
''
anull
. Normálně jsou to samé v Oracle, ale přiřazují''
nachar
hodnota spustí jeho chování prázdného odsazení, zatímconull
nebude, takže pokud je důležité rozeznat rozdíl a ve skutečnosti mě nenapadá důvod, proč by tomu tak bylo, pak máte způsob, jak to udělat. - Váš kód je přenesen z nějakého jiného systému (nebo musí být kompatibilní s) z jiného systému, který z důvodu starší verze vyžaduje prázdná místa. V tom případě jste u toho zůstali a máte mé sympatie.
Opravdu není žádný důvod používat char
jen proto, že je určitá délka pevná (např. Y/N
vlajka nebo kód měny ISO, například 'USD'
). Není to efektivnější, nešetří to místo (pro varchar2
neexistuje žádný mýtický indikátor délky , pro char
je pouze prázdná výplň ), a nikomu to nebrání zadávat kratší hodnoty. (Pokud zadáte 'ZZ'
ve vašem char(3)
měna, bude uložen jako 'ZZ '
.) Není ani zpětně kompatibilní s nějakou starodávnou verzí Oracle, která na ní kdysi spoléhala, protože nikdy žádná neexistovala.
A nákaza se může rozšířit, protože (podle doporučeného postupu) můžete ukotvit deklaraci proměnné pomocí něčeho jako sales.currency%type
. Nyní vaše l_sale_currency
proměnná je stealth char
což bude u kratších hodnot neviditelně prázdné (nebo ''
), otevírající dveře k obskurním chybám, kde l_sale_currency
nerovná se l_refund_currency
i když jste přiřadili 'ZZ'
oběma.
Někteří tvrdí, že char(n)
(kde n je nějaká délka znaku) znamená, že se očekává, že hodnoty budou n dlouhé postavy, a to je forma sebedokumentace. Ale jistě, pokud to s formátem o 3 znacích myslíte vážně (kódy zemí ISO-Alpha-3 spíše než ISO-Alpha-2, například), nedefinovali byste omezení pro vynucení pravidla, místo abyste nechali vývojáře podívat se na char(3)
datový typ a vyvodit vlastní závěry?
CHAR
byl představen v Oracle 6, jsem si jistý, z důvodů kompatibility ANSI. Pravděpodobně existují potenciální zákazníci, kteří se rozhodují, který databázový produkt koupit, a kompatibilita ANSI je na jejich kontrolním seznamu (nebo býval v té době) a CHAR
s blank-padding je definován ve standardu ANSI, takže Oracle jej musí poskytnout. Neměli byste to skutečně používat.