Sqlite
在 sqlite 中使用正確的數據類型更新表模式
我知道從 CSV 導入 SQLite 會將所有欄位都視為文本。根據How to import csv file to sqlite with correct data types,可以使用
UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
更新整個列類型。這似乎有效,但這似乎並沒有反映
TYPEOF()
在PRAGMA table_info(table_name)
sqlite> CREATE TABLE testtb (a TEXT, b TEXT); sqlite> INSERT INTO testtb VALUES ('1', '2'); sqlite> UPDATE testtb SET b = CAST(b AS INTEGER); sqlite> SELECT TYPEOF(b) FROM testtb; text sqlite> PRAGMA table_info(testtb); 0|a|TEXT|0||0 1|b|TEXT|0||0
那麼,在查詢表的元資訊時,如何才能使更改真正顯示出來(我在這裡缺少正確的措辭,但希望這是有道理的)?
如果您真的想要,只需將您的第一個表用作臨時表,然後再繼續創建具有正確數據類型和數據的最終表:
sqlite> PRAGMA table_info(testtb); 0|a|TEXT|0||0 1|b|TEXT|0||0 sqlite> create table testtb2 (a INT, b INT); sqlite> insert into testtb2 (a,b) select a,b from testtb ; sqlite> select * from testtb2; 1|2 sqlite> PRAGMA table_info(testtb2); 0|a|INT|0||0 1|b|INT|0||0 sqlite>
歸根結底,您必須記住(在某種程度上)sqlite 實際上並不關心 datatypes。
SQLite 在數據類型方面非常靈活。
一些評論家說 SQLite 是“弱類型”,而其他 SQL 數據庫是“強類型”。我們認為這些術語是不准確的和瀉藥的。我們更願意說 SQLite 是“靈活類型”的,而其他 SQL 數據庫是“剛性類型”的。
關鍵是 SQLite 對您放入數據庫的數據類型非常寬容。例如,如果一列的數據類型為“INTEGER”並且應用程序將文本字元串插入該列,SQLite 將首先嘗試將文本字元串轉換為整數,就像所有其他 SQL 數據庫引擎一樣。因此,如果將“1234”插入 INTEGER 列,則該值將轉換為整數 1234 並儲存。但是,如果你在 INTEGER 列中插入一個像 ‘wxyz’ 這樣的非數字字元串,與其他 SQL 數據庫不同,SQLite 不會引發錯誤。相反,SQLite 將實際的字元串值儲存在列中。