2016-07-31 32 views
0

我测试,看看我能传递一个字符串到我的SQLite数据库到如下表:为什么我应该在SQL中使用datetime?

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(实际上,CHARDATETIME有更多的限制,它限制了字符的数量)?

所有这些都在测试:

回答

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), 
    [...] 
); 

¹和CHAR( x)是否不是限制了长度。

+0

为什么要输入任何东西呢?这样做有没有优势? (除了知道什么类型应该在哪里) –

+0

与其他SQL DB的兼容性。 –