Въпреки че вече има няколко отговора, описващи правилно поведението на char , мисля, че трябва да се каже, че не бива да го използвате освен в три специфични ситуации:
- Изграждате файл или отчет с фиксирана дължина и присвоявате ненулева стойност на
charизбягва необходимостта от кодиране наrpad()изразяване. Например, акоfirstnameиlastnameи двете са дефинирани катоchar(20), след товаfirstname || lastnameе по-кратък начин за писане наrpad(firstname,20) || rpad(lastname,20)за да създадетеChuck Norris. - Трябва да правите разлика между изричния празен низ
''иnull. Обикновено те са едно и също нещо в Oracle, но присвояват''къмcharvalue ще задейства поведението си с празно запълване, докато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 трябва да го предостави. Не трябва да го използвате в действителност.