2016-01-03 30 views
0

當我在Python中運行不正確的語句時,我不會收到任何錯誤或警告。聲明如下:SQLite不正確CREATE TABLE語句不會引發任何錯誤或警告

CREATE TABLE mystery_table(id mystery_type) 

正如你看到的,我在這裏使用了不正確的數據類型mystery_type,還是創建表,當我運行

SELECT name FROM sqlite_master where type = 'table' 

我得到的表與列表其中有mystery_table。那麼,爲什麼呢?爲什麼可以運行一些垃圾語句並獲得一些結果?謝謝! PS。我不是在sqlite3提示符下運行所有​​這些命令,而是通過Python運行。

回答

5

對於它的價值,這也可以在sqlite3控制檯中使用。

基礎上sqlite3 FAQs,SQLite不出現,嚴格執行創建表時應用類型的限制,而只是使用它們,當你以後檢索格式化數據:

[SQLite的]不執行數據類型約束。任何類型的數據都可以(通常)插入到任何列中。 [...]但SQLite確實使用列的聲明類型作爲您偏好該格式的值的提示。因此,例如,如果一列的類型爲INTEGER,並且您嘗試向該列中插入字符串,則SQLite將嘗試將該字符串轉換爲整數。如果可以,它會插入整數。如果不是,則插入字符串。此功能稱爲類型關聯。

documentation on type affinity表明,它適用NUMERIC的一個數據類型,如果它不識別你提供的類型:

列的親和力是通過聲明的類型的列的確定,根據以所示順序的以下規則:

  1. 如果聲明類型包含字符串「INT」,則它被分配INTEGER親和力。

  2. 如果列的聲明類型包含任何字符串「CHAR」,「CLOB」或「TEXT」,那麼該列具有TEXT關聯。請注意,類型VARCHAR包含字符串「CHAR」,並因此分配了TEXT關聯。

  3. 如果某個列的聲明類型包含字符串「BLOB」或未指定任何類型,則該列具有親和性BLOB。

  4. 如果列的聲明類型包含任何字符串「REAL」,「FLOA」或「DOUB」,則該列具有REAL關聯性。

  5. 否則,親和力是NUMERIC。

在此基礎上,它看起來像SQLite是解釋你mystery_type的數據類型爲數字。