Въпреки че вече има няколко отговора, описващи правилно поведението на char
, мисля, че трябва да се каже, че не бива да го използвате освен в три специфични ситуации:
- Изграждате файл или отчет с фиксирана дължина и присвоявате ненулева стойност на
char
избягва необходимостта от кодиране наrpad()
изразяване. Например, акоfirstname
иlastname
и двете са дефинирани катоchar(20)
, след товаfirstname || lastname
е по-кратък начин за писане наrpad(firstname,20) || rpad(lastname,20)
за да създадетеChuck Norris
. - Трябва да правите разлика между изричния празен низ
''
иnull
. Обикновено те са едно и също нещо в Oracle, но присвояват''
къмchar
value ще задейства поведението си с празно запълване, докато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(n)
(където n е известна дължина на знака) показва, че се очаква стойностите да бъдат n символи дълги и това е форма на самодокументиране. Но със сигурност, ако се отнасяте сериозно към 3-знаков формат (ISO-Alpha-3 кодове, а не ISO-Alpha-2, например), не бихте ли дефинирали ограничение за прилагане на правилото, вместо да позволите на разработчиците да хвърлят поглед върху a char(3)
тип данни и да направят свои собствени заключения?
CHAR
беше въведен в Oracle 6 заради, сигурен съм, причини за съвместимост с ANSI. Вероятно има потенциални клиенти, които решават кой продукт за база данни да закупят и ANSI съвместимост е в техния контролен списък (или е бил тогава) и CHAR
с blank-padding е дефиниран в стандарта ANSI, така че Oracle трябва да го предостави. Не трябва да го използвате в действителност.