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
charvyhýbá se nutnosti kódovatrpad()výraz. Například pokudfirstnamealastnamejsou oba definovány jakochar(20), pakfirstname || lastnameje 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í''nacharhodnota spustí jeho chování prázdného odsazení, zatímconullnebude, 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.