2016-07-31 2 views
0

я тестировал, чтобы увидеть, если я мог передавать строки в моей базе данных SQLite в следующей таблице:Почему я должен использовать datetime в SQL?

CREATE TABLE TIMES(
    ID    INT    PRIMARY KEY     , 
    TIME_START  DATETIME  DEFAULT CURRENT_TIMESTAMP , 
    TIME_STOP  DATETIME         , 
    CONSTRAINT FUTURE_DATE CHECK 
     (TIME_START >= CURRENT_TIMESTAMP AND TIME_STOP >= CURRENT_TIMESTAMP) 
); 

Как так:

INSERT INTO TIMES VALUES (1, "2016-07-31 07:08:00", NULL) 

Он не прошел, никаких проблем. Я был немного ошеломлен, чтобы увидеть это, поэтому я попробовал другое значение:

INSERT INTO TIMES VALUES (2, "9999999999 07:08:00", NULL) 

И он прошел через. Это вызвало у меня беспокойство, поскольку оно должно допускать только значения DATETIME, а не пучок чисел. Я пробовал другие значения:

INSERT INTO TIMES VALUES (3, "9999999999:::::::::", NULL); 
INSERT INTO TIMES VALUES (4, "9999999999 99:99:99", NULL); 
INSERT INTO TIMES VALUES (6, "this is some really random text", NULL); 
INSERT INTO TIMES VALUES (6, "9999999999999999999", NULL); 

Все, кроме последнего, работало. Мой вопрос: зачем использовать дату, когда оно не проверяет тип данных? Нельзя просто использовать CHAR (ведь CHAR имеет больше ограничений, чем DATETIME, ограничивает количество символов)?

Все они проверены на:

ответ

0

SQLite использует dynamic typing; неважно, используете ли вы DATETIME или CHAR¹ или FLUFFY BUNNIES.

Если вы хотите обеспечить, что значение в любом из supported formats, вы можете добавить явное ограничение, чтобы проверить, что некоторые built-in date function способен разобрать его:

CREATE TABLE Times(
    Time_Stop DATETIME CHECK (date(Time_Stop) IS NOT NULL), 
    [...] 
); 

¹ и сажу (x) нет ограничение длина.

+0

Зачем мне вводить что-нибудь? Есть ли преимущества в этом? (Не знаю, какие типы должны быть где) –

+0

Для совместимости с другими SQL-базами данных. –

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