2015-01-28 2 views
0

В PL/SQL DATE datatype хранит фиксированные значения длины. Они сохраняются в двоичном формате, но отображаются как символ в формате по умолчанию.Представление NULL в двоичном формате

Рассмотрим следующее заявление:

v_regdate DATE; 

Здесь v_regdate не инициализирована, следовательно, его значение равно NULL. Просто интересно, как NULL будет храниться в двоичном формате.

+5

Я не уверен, что ваш вопрос имеет смысл. Для нулевого значения ничего не хранить. Это не какое-то волшебное значение, это значение * no *. –

+0

Дата является фиксированным типом данных. Следовательно, переменная v_regdate должна иметь некоторое значение в памяти, которое представляет NULL. – davison

+3

Предположим, что представление внутри/в памяти этого типа просто его значение, скорее это будет какая-то структура с семантикой или связанными метаданными, которая может указывать на то, что она имеет нулевое значение –

ответ

2

В PL/SQL DATE типов данных магазинов фиксированные значения длины ...

Это не совсем верно. Дата имеет внутреннее представление с использованием семи байтов, да, и все фактические даты имеют длину в семь байтов, если вы хотите посмотреть на нее так. Вы можете видеть, что в ответ dump() от @ kostist, поэтому я не буду повторять его.

Но нулевое значение не имеет этих семи байтов, которые все установлены на что-то - это не волшебное значение, если это то, что вы ищете; например, это не семь байтов 0x00. Переменная с нулевым значением имеет длину в 0 байт.

+0

, поэтому DATE является фиксированным типом данных длины не выполняется, когда его NULL. – davison

+3

@ davison - почему вы думаете, что это тип данных фиксированной длины? Может быть, расщепление волос, но я не уверен, откуда у вас этот термин. Все допустимые даты представлены в семи байтах, но это внутреннее представление - деталь реализации, если хотите. И null является непостижимым ... –

+1

@AlexPoole Я согласен, что, возможно, неправильно понял эту строку «Данные даты хранятся в полях с фиксированной длиной по 7 байтов каждый». Спасибо, что расчистили его http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT413 – davison

4

Если значение заданной даты (фактически, любого типа данных) переменной/столбца равно null, то ничего не сохраняется. Null - это просто стенография, nada, zip (по крайней мере, с точки зрения того, какие данные хранятся).

Вы можете увидеть, что из этого теста:

create table test (col1 number, col2 date); 

insert into test (col1) values (1); 

insert into test (col1, col2) values (2, sysdate); 

commit; 

select col1, 
     to_char(col2, 'dd/mm/yyyy hh:mi:ss') col2, 
     dump(col1) col1_dump, 
     dump(col2) col2_dump 
from test; 


     COL1 COL2    COL1_DUMP   COL2_DUMP        
---------- ------------------- -------------------- ---------------------------------------- 
     1      Typ=2 Len=2: 193,2 NULL          
     2 28/01/2015 11:12:33 Typ=2 Len=2: 193,3 Typ=12 Len=7: 120,115,1,28,12,13,34  

drop table test; 

Обратите внимание на «NULL» сообщает отвала col2 для нулевого значения; это означает, что в этой колонке для этой строки ничего не хранится ».

2

Помните, что Oracle не определяет способ хранения нулевого значения для данного типа данных, поскольку определение null действительно «НЕ ОПРЕДЕЛЕН». Вот почему, например:

SELECT 1 FROM DUAL ГДЕ NULL = NULL;

ничего не возвращает. Вы не можете сравнить один «неопределенный» с другим «неопределенным» и ожидать эквивалентности.

+0

Вы очень близки к истине, но, как я понял, все еще существует разница между null и undefined. NULL - это просто NULL, сравнивая NULL с NULL (как в вашем примере), дает результат UNDEFINED, который не является TRUE или FALSE. Более подробное объяснение здесь: http://www.psinke.nl/blog/hello-world/ –

Смежные вопросы