SQLite - 資料類型

你好,未來的數據庫大師!今天,我們將深入探索SQLite資料類型的迷人世界。別擔心你對編程是新手——我將成為你這次旅程中的友好導遊,一步步為你解釋一切。所以,來一杯咖啡(或者茶,如果你喜歡的話),我們開始吧!

SQLite - Data Type

SQLite 儲存類別

首先,讓我們來谈谈SQLite的儲存類別。可以把這些看作是SQLite數據的基本構建塊。有五種主要的儲存類別:

  1. NULL
  2. INTEGER
  3. REAL
  4. TEXT
  5. 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有五種類型親和性:

  1. TEXT
  2. NUMERIC
  3. INTEGER
  4. REAL
  5. 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