SQLite - 資料類型
你好,未來的數據庫大師!今天,我們將深入探索SQLite資料類型的迷人世界。別擔心你對編程是新手——我將成為你這次旅程中的友好導遊,一步步為你解釋一切。所以,來一杯咖啡(或者茶,如果你喜歡的話),我們開始吧!
SQLite 儲存類別
首先,讓我們來谈谈SQLite的儲存類別。可以把這些看作是SQLite數據的基本構建塊。有五種主要的儲存類別:
- NULL
- INTEGER
- REAL
- TEXT
- BLOB
讓我們用一些例子來詳細說明這些:
NULL
CREATE TABLE example (
id INTEGER,
name TEXT,
age INTEGER
);
INSERT INTO example (id, name) VALUES (1, 'Alice');
在這個例子中,我們創建了一個表並插入了一行,其中'age'列未指定。SQLite會自動將其分配為NULL值。NULL代表數據的缺失——就像說,“我們不知道Alice的年齡。”
INTEGER
INSERT INTO example (id, name, age) VALUES (2, 'Bob', 30);
在這裡,我們將Bob的年齡插入為30。SQLite將其存儲為INTEGER。整數是不帶小數點的整數。
REAL
CREATE TABLE products (
id INTEGER,
name TEXT,
price REAL
);
INSERT INTO products (id, name, price) VALUES (1, '咖啡', 3.99);
價格3.99被存儲為REAL值,這是SQLite處理小數數字的方式。
TEXT
INSERT INTO example (id, name, age) VALUES (3, 'Charlie', '25歲');
即使我們正在存儲年齡,我們在這裡使用了TEXT。SQLite會將"25歲"存儲為字符串。
BLOB
BLOB代表二進制大對象。它用於存儲如圖像或文件等的二進制數據。
CREATE TABLE files (
id INTEGER,
name TEXT,
content BLOB
);
-- 插入BLOB通常會在應用程序代碼中進行,而不是在原始SQL中
SQLite 類型親和性
現在,讓我們來谈谈類型親和性。這是SQLite對數據類型靈活的處理方式。想像一下SQLite努力理解你要存儲的數據類型。
SQLite有五種類型親和性:
- TEXT
- NUMERIC
- INTEGER
- REAL
- BLOB
這裡有一個有趣的表來告訴你SQLite如何決定使用哪種親和性:
如果聲明的類型包含... | 親和性是... |
---|---|
INT | INTEGER |
CHAR, CLOB, TEXT | TEXT |
BLOB | BLOB |
REAL, FLOA, DOUB | REAL |
其他任何東西 | NUMERIC |
讓我們看看它在實際中是如何工作的:
CREATE TABLE affinity_example (
a TEXT,
b NUMERIC,
c INTEGER,
d REAL,
e BLOB
);
INSERT INTO affinity_example VALUES
('123', '456', '789', '101112', x'ABCDEF');
SELECT typeof(a), typeof(b), typeof(c), typeof(d), typeof(e) FROM affinity_example;
這將輸出:
text, integer, integer, real, blob
注意'456'因為NUMERIC親和性而變成了整數!
SQLite 親和性和類型名稱
SQLite在列類型名稱方面非常靈活。你可以使用標準SQL類型,SQLite會將它們映射到它的親和性。這裡有一個快速參考:
類型名稱 | 親和性 |
---|---|
INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 | INTEGER |
CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB | TEXT |
BLOB, 未指定數據類型 | BLOB |
REAL, DOUBLE, DOUBLE PRECISION, FLOAT | REAL |
NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME | NUMERIC |
布爾數據類型
SQLite沒有獨立的布爾類型,但別讓這個愚弄你!我們仍然可以處理true/false值。SQLite將0視為false,1視為true。
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
description TEXT,
completed BOOLEAN
);
INSERT INTO tasks (description, completed) VALUES
('學習SQLite', 0),
('精通SQL', 1);
SELECT * FROM tasks WHERE completed = TRUE;
這將返回"精通SQL"任務,因為它的'completed'值是1(true)。
日期和時間數據類型
最後但同樣重要的是,讓我們來谈谈日期和時間。SQLite沒有內置的日期或時間類型,但它提供了若干日期和時間函數來處理這些值。
我們通常將日期和時間存儲為TEXT,INTEGER或REAL:
CREATE TABLE events (
id INTEGER PRIMARY KEY,
name TEXT,
date_text TEXT,
date_int INTEGER,
date_real REAL
);
INSERT INTO events (name, date_text, date_int, date_real) VALUES
('SQLite工作坊', '2023-06-15', 1686787200, 1686787200.0);
SELECT name,
date_text,
datetime(date_int, 'unixepoch') as date_from_int,
datetime(date_real, 'unixepoch') as date_from_real
FROM events;
這將輸出類似於以下內容:
SQLite工作坊, 2023-06-15, 2023-06-15 00:00:00, 2023-06-15 00:00:00
就是这样!我們已經介紹了SQLite中的主要數據類型,從基本的儲存類別到類型親和性的更微妙概念。記住,SQLite的靈活性既是其優勢,也是需要注意的地方。總是要測試你的數據,以確保它被存儲和检索的方式符合你的期望。
熟練使人完美,所以不要害怕嘗試這些概念。創建你自己的表,插入一些數據,看看SQLite如何處理不同的情節。在你知曉之前,你將成為SQLite數據類型的專家!
開心編程,願你的數據庫總是正規化!
Credits: Image by storyset