2017-10-14 45 views
1

我想更好地學習SQL,所以我使用的sqlite3從頭開始。當我試圖將一個字符串值插入一個被指定爲int的值時,它完美地工作。有人可以解釋這可能嗎?爲什麼我的字符串在sql db中被接受爲int值?

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE entertainment(num INT, show TEXT, myRating INT); 
INSERT INTO "entertainment" VALUES(1,'Mr. Robot',10); 
INSERT INTO "entertainment" VALUES(7,'Narcos','el classic'); 
INSERT INTO "entertainment" VALUES(8,'Suits',7); 
INSERT INTO "entertainment" VALUES(9,'Friends',"classic"); 
COMMIT; 

回答

1

SQLITE3在這方面非常靈活。簡而言之,sqlite3將根據需要轉換數據或將其存儲爲它,而不管您指定的類型如何。但是,通過指定數據類型,sqlite3將使用該信息儘可能高效地存儲數據。

當定義列作爲INTEGER,sqlite3的分配INTEGER向列型的親和力。還有一個NUMERIC類型的親和力。

具有NUMERIC關聯性的列可能包含使用所有五個存儲類的值。將文本數據插入到NUMERIC列時,如果此類轉換是無損和可逆的,則文本的存儲類將轉換爲INTEGER或REAL(按優先順序排列)。對於TEXT和REAL存儲類之間的轉換,如果保留數字的前15個十進制數字,SQLite會認爲轉換是無損和可逆的。如果無法將TEXT無損轉換爲INTEGER或REAL,則該值將使用TEXT存儲類進行存儲。沒有嘗試轉換NULL或BLOB值。

和整數親和力定義如下:

使用INTEGER親和性的列的行爲相同,與NUMERIC親和性的柱。 INTEGER與NUMERIC親和力之間的差異僅在CAST表達式中很明顯。

在你的情況,sqlite3不會轉換文本,但使用TEXT存儲類來存儲它。

請參閱SQLite參考中的Datatypes頁面,以獲取有關數據類型,存儲類和類型關係的更多詳細信息。

0

https://sqlite.org/faq.html#q3

(3)的SQLite讓我插入一個字符串轉換爲整數類型的數據庫列!

這是一個功能,而不是一個錯誤。 SQLite使用動態類型。它不強制數據類型約束。任何類型的數據都可以(通常)插入到任何列中。您可以將任意長度的字符串放入整數列,布爾列中的浮點數或字符列中的日期。您在CREATE TABLE命令中分配給列的數據類型不限制可將哪些數據放入該列。每列可以容納任意長度的字符串。 (有一個例外:類型爲INTEGER PRIMARY KEY的列可能只能保存64位有符號整數,如果您嘗試將除INTEGER PRIMARY KEY列之外的其他任何內容放入INTEGER PRIMARY KEY列中,則會導致錯誤。)

但SQLite確實使用列的聲明類型作爲您偏好該格式的值的提示。因此,例如,如果一列的類型爲INTEGER,並且您嘗試向該列中插入字符串,則SQLite將嘗試將該字符串轉換爲整數。如果可以,它會插入整數。如果不是,則插入字符串。此功能稱爲類型關聯。

0

根據docs

這是一個功能,不是一個錯誤。 SQLite使用動態類型。它不強制數據類型約束。任何類型的數據都可以(通常)插入到任何列中。您可以將任意長度的字符串放入整數列,布爾列中的浮點數或字符列中的日期。

相關問題