Oracle
 sql >> база данни >  >> RDS >> Oracle

Каква е основната разлика между Varchar2 и char

Въпреки че вече има няколко отговора, описващи правилно поведението на char , мисля, че трябва да се каже, че не бива да го използвате освен в три специфични ситуации:

  1. Изграждате файл или отчет с фиксирана дължина и присвоявате ненулева стойност на char избягва необходимостта от кодиране на rpad() изразяване. Например, ако firstname и lastname и двете са дефинирани като char(20) , след това firstname || lastname е по-кратък начин за писане на rpad(firstname,20) || rpad(lastname,20) за да създадете Chuck Norris .
  2. Трябва да правите разлика между изричния празен низ '' и null . Обикновено те са едно и също нещо в Oracle, но присвояват '' към char value ще задейства поведението си с празно запълване, докато null няма да е така, така че ако е важно да се направи разликата и не мога да измисля причина защо ще бъде, тогава имате начин да го направите.
  3. Вашият код е пренесен от (или трябва да е съвместим с) друга система, която изисква празно допълване поради наследени причини. В такъв случай си останал с него и изпитваш моето съчувствие.

Наистина няма причина да използвате 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 трябва да го предостави. Не трябва да го използвате в действителност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Винаги да се показват десетичните знаци в SQL?

  2. Има ли начин да получите номера на реда в Mysql като rownum в oracle

  3. ORA-12514 TNS:слушателят в момента не знае за услуга, поискана в дескриптора на свързване

  4. Как предавате аргумент на PL/SQL блок в sql файл, извикан с помощта на START в sqlplus?

  5. Експортирайте данни в Excel от Oracle Table с помощта на PL SQL