SQLite:指定數據類型有什麼用?
據我所知,SQLite 不強制定義表數據類型——它具有動態類型。例如,它允許您將字元串插入數字欄位,或超過字元串的長度。
如果是這樣,那麼在
CREATE TABLE
語句中定義數據類型的意義何在?
SQLite 中有幾個定義數據類型的基本原理,或者 SQLite 稱之為“儲存類”。
如果您閱讀此頁面,它將深入了解 SQLite 數據類型的功能和背後的推理。特別是,該頁面的以下部分很有趣。
然而,SQLite 中的動態類型允許它完成傳統剛性類型數據庫中不可能完成的事情。
即像 C 程式語言一樣,SQLite 允許您做非常愚蠢的事情,因為它還允許您做非常聰明的事情 - 例如,將 C 與 Java 和 SQLite 與其他 RDBMS 進行比較。
和:
儲存類比數據類型更通用。
另一個原因:
在 SQLite 中,值的數據類型與值本身相關聯,而不是與其容器相關聯。SQLite 的動態類型系統向後兼容其他數據庫引擎的更常見的靜態類型系統,因為在靜態類型數據庫上工作的 SQL 語句應該在 SQLite 中以相同的方式工作。
還:
所以在大多數情況下,“儲存類”與“數據類型”沒有區別,這兩個術語可以互換使用。
注意“在大多數情況下……”
為了最大限度地提高 SQLite 和其他數據庫引擎之間的兼容性,並使上面的範例能夠像在其他 SQL 數據庫引擎上一樣在 SQLite 上工作,SQLite 支持列上的“類型親和性”概念。列的類型親和性是儲存在該列中的數據的推薦類型。這裡的重要思想是該類型是推薦的,而不是必需的。
因此,這種通用性的一個很好的理由是與市場上幾乎所有引擎的向後兼容性 - 預設不適合您,您可以自由更改程式碼(公共域許可證)。SQLite 是世界上最受歡迎的 RDBMS 的另一個原因!
還有一個有趣的花絮:
具有 REAL 親和性的列的行為類似於具有 NUMERIC 親和性的列,不同之處在於它將整數值強制轉換為浮點表示。(作為內部優化,沒有小數部分並儲存在具有 REAL 親和性的列中的小浮點值作為整數寫入磁碟以佔用更少的空間,並在讀出值時自動轉換回浮點數。這優化在 SQL 級別是完全不可見的,只能通過檢查數據庫文件的原始位來檢測。)
因此,具有 REAL 親和性的列(與 INTEGER 相對)實際上確實對查詢和/或計算的結果產生了功能差異。例如,字元串 ‘456.567’(SQLite 將BLOB 和數字儲存為二進制,就像所有其他 SQL 數據庫引擎一樣)在 NUMERIC 計算中將被視為 456.567,但不會嘗試強制 ‘6&%$$$#3’任何類型的數字。
SQLite 做出的一個重要假設是程序員為王,而不是引擎!如果出於某種原因,您想將 ‘6&%$$$#3’ 轉換為 INTEGER,那麼您可以編寫自己的算法,但 SQLite假設如果您希望處理 ‘6&%$$$# 3’ 作為 INTEGER,那麼你一定有充分的理由做出這樣的選擇!
一個簡潔的說法是 SQLite 為您提供了非常強大的工具,但就像任何強大的工具一樣,您必須謹慎和克制。基本上,SQLite 說“你是一個成年人——如果你想用我給你的釘槍射中自己的頭部,那就去吧,但如果你受傷了,不要怪我!”。