2016-07-31 31 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的兼容性。 –