sql >> Databáze >  >> RDS >> Oracle

Jaký je hlavní rozdíl mezi Varchar2 a char

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í:

  1. Vytváříte soubor nebo sestavu s pevnou délkou a přiřazujete nenulovou hodnotu k char vyhýbá se nutnosti kódovat rpad() výraz. Například pokud firstname a lastname jsou oba definovány jako char(20) , pak firstname || lastname je kratší způsob zápisu rpad(firstname,20) || rpad(lastname,20) vytvořit Chuck Norris .
  2. Musíte rozlišovat mezi explicitním prázdným řetězcem '' a null . Normálně jsou to samé v Oracle, ale přiřazují '' na char hodnota spustí jeho chování prázdného odsazení, zatímco null 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.
  3. 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.



  1. Rozdíl mezi SELECT INTO a INSERT INTO v MySQL

  2. Pokyny krok za krokem pro instalaci Oracle Virtual Box

  3. Jarní konference PostgreSQL 2011, USA/Kanada

  4. Klonovat ORACLE_HOME