Я знаю, що ця тема трохи суперечлива, і в Інтернеті пливе багато різноманітних статей / думок. На жаль, більшість з них припускають, що людина не знає, в чому різниця між NULL і порожнім рядком. Таким чином вони розповідають історії про дивовижні результати приєднаннях / агрегатах і, як правило, роблять трохи більш досконалі уроки SQL. Роблячи це, вони абсолютно пропускають всю суть і тому для мене марні. Тож сподіваємось, що це запитання та всі відповіді перемістять тему трохи вперед.
Припустимо, у мене є таблиця з особистими даними (ім’я, народження тощо), де один із стовпців - це адреса електронної пошти з типом varchar. Ми припускаємо, що чомусь деякі люди можуть не захотіти надати адресу електронної пошти. Під час вставлення таких даних (без електронної пошти) у таблицю є два доступні варіанти: встановити комірку на NULL або встановити порожній рядок (''). Припустимо, що я знаю про всі технічні наслідки вибору одного рішення над іншим, і я можу створити правильні SQL запити для будь-якого сценарію. Проблема навіть тоді, коли обидва значення різняться на технічному рівні, на логічному рівні вони однакові. Подивившись на NULL і "" Я прийшов до єдиного висновку: я не знаю електронної адреси хлопця. Крім того, як би я не намагався, Мені не вдалося надіслати електронний лист, використовуючи NULL або порожню рядок, тому, мабуть, більшість SMTP-серверів там згодні з моєю логікою. Тому я схильний використовувати NULL там, де я не знаю значення і вважаю порожню рядок поганою справою.
Після декількох напружених дискусій з колегами, я прийшов з двома питаннями:
я маю рацію припускати, що використання порожнього рядка для невідомого значення змушує базу даних "брехати" про факти? Якщо бути більш точним: використовуючи уявлення SQL про те, що є значенням, а що ні, я можу прийти до висновку: у нас є електронна адреса, лише з'ясувавши, що вона не є нульовою. Але згодом, намагаючись надіслати електронний лист, я прийду до суперечливого висновку: ні, у нас немає електронної адреси, що @! # $ База даних, мабуть, бреше!
Чи є логічний сценарій, коли порожній рядок '' може бути таким хорошим носієм важливої інформації (окрім значення та без значення), який було б складно / неефективно зберігати будь-яким іншим способом (наприклад, додатковим стовпцем). Я бачив багато повідомлень, які стверджують, що іноді добре використовувати порожню рядок разом з реальними значеннями та NULL, але поки що не бачив сценарій, який був би логічним (з точки зору дизайну SQL / DB).
PS Деякі люди будуть спокушатись відповісти, що це лише питання особистого смаку. Я не згоден. Для мене це дизайнерське рішення з важливими наслідками. Тож я хотів би побачити відповіді, де думка про це підкріплюється якимись логічними та / або технічними причинами.
''
навіть у Oracle це не те саме, що NULL
. Наприклад, призначення CHAR(1)
стовпця значення ''
призведе до ' '
(тобто пробілу), а не NULL
. Крім того, якби Яцек використовував Oracle, це питання, швидше за все, навіть не виникне :-)
'' IS NULL
значення true
в PL / SQL.