Tóm tắt :trong hướng dẫn này, bạn sẽ tìm hiểu về hệ thống kiểu dữ liệu SQLite và các khái niệm liên quan của nó, chẳng hạn như các lớp lưu trữ, nhập tệp kê khai và mối quan hệ kiểu.
Giới thiệu về kiểu dữ liệu SQLite
Nếu bạn đến từ các hệ thống cơ sở dữ liệu khác như MySQL và PostgreSQL, bạn nhận thấy rằng chúng sử dụng gõ tĩnh . Có nghĩa là khi bạn khai báo một cột có kiểu dữ liệu cụ thể, cột đó chỉ có thể lưu trữ dữ liệu của kiểu dữ liệu đã khai báo.
Khác với các hệ thống cơ sở dữ liệu khác, SQLite sử dụng hệ thống kiểu động . Nói cách khác, giá trị được lưu trữ trong cột xác định kiểu dữ liệu của nó, không phải kiểu dữ liệu của cột.
Ngoài ra, bạn không phải khai báo kiểu dữ liệu cụ thể cho một cột khi tạo bảng. Trong trường hợp bạn khai báo một cột với kiểu dữ liệu số nguyên, bạn có thể lưu trữ bất kỳ kiểu dữ liệu nào như văn bản và BLOB, SQLite sẽ không phàn nàn về điều này.
SQLite cung cấp năm kiểu dữ liệu nguyên thủy được gọi là lớp lưu trữ.
Các lớp lưu trữ mô tả các định dạng mà SQLite sử dụng để lưu trữ dữ liệu trên đĩa. Lớp lưu trữ tổng quát hơn kiểu dữ liệu, ví dụ:INTEGER
lớp lưu trữ bao gồm 6 loại số nguyên khác nhau. Trong hầu hết các trường hợp, bạn có thể sử dụng các lớp lưu trữ và kiểu dữ liệu thay thế cho nhau.
Bảng sau minh họa 5 lớp lưu trữ trong SQLite:
Lớp lưu trữ | Ý nghĩa |
---|---|
KHÔNG ĐỦ | Giá trị NULL có nghĩa là thiếu thông tin hoặc không xác định. |
INTEGER | Giá trị số nguyên là số nguyên (dương hoặc âm). Một số nguyên có thể có các kích thước thay đổi như 1, 2,3, 4 hoặc 8 byte. |
THỰC | Giá trị thực là các số thực có giá trị thập phân sử dụng số thực 8 byte. |
VĂN BẢN | TEXT được sử dụng để lưu trữ dữ liệu ký tự. Độ dài tối đa của TEXT là không giới hạn. SQLite hỗ trợ các mã hóa ký tự khác nhau. |
BLOB | BLOB là viết tắt của một đối tượng lớn nhị phân có thể lưu trữ bất kỳ loại dữ liệu nào. Về mặt lý thuyết, kích thước tối đa của BLOB là không giới hạn. |
SQLite xác định kiểu dữ liệu của một giá trị dựa trên kiểu dữ liệu của nó theo các quy tắc sau:
- Nếu một ký tự không có dấu ngoặc kép kèm theo dấu ngoặc kép hoặc số mũ, SQLite sẽ chỉ định lớp lưu trữ INTEGER.
- Nếu một ký tự được bao bởi dấu ngoặc kép hoặc đơn, SQLite sẽ chỉ định lớp lưu trữ TEXT.
- Nếu một chữ không có dấu ngoặc kép, dấu thập phân cũng như số mũ, thì SQLite sẽ chỉ định lớp lưu trữ THỰC.
- Nếu một ký tự là NULL mà không có dấu ngoặc kép, nó được gán lớp lưu trữ NULL.
- Nếu một ký tự có X’ABCD ’hoặc x‘ abcd ’, SQLite đã chỉ định lớp lưu trữ BLOB.
SQLite không hỗ trợ các lớp lưu trữ ngày và giờ tích hợp sẵn. Tuy nhiên, bạn có thể sử dụng TEXT, INT hoặc REAL để lưu trữ các giá trị ngày và giờ. Để biết thông tin chi tiết về cách xử lý các giá trị ngày và giờ, hãy xem hướng dẫn ngày và giờ trên SQLite.
SQLites cung cấp typeof()
cho phép bạn kiểm tra lớp lưu trữ của một giá trị dựa trên định dạng của nó. Xem ví dụ sau:
SELECT
typeof(100),
typeof(10.0),
typeof('100'),
typeof(x'1000'),
typeof(NULL);
Code language: SQL (Structured Query Language) (sql)
Một cột duy nhất trong SQLite có thể lưu trữ các kiểu dữ liệu hỗn hợp. Xem ví dụ sau.
Đầu tiên, tạo một bảng mới có tên test_datatypes
để thử nghiệm.
CREATE TABLE test_datatypes (
id INTEGER PRIMARY KEY,
val
);
Code language: SQL (Structured Query Language) (sql)
Thứ hai, chèn dữ liệu vào test_datatypes
bảng.
INSERT INTO test_datatypes (val)
VALUES
(1),
(2),
(10.1),
(20.5),
('A'),
('B'),
(NULL),
(x'0010'),
(x'0011');
Code language: SQL (Structured Query Language) (sql)
Thứ ba, sử dụng typeof()
hàm để lấy kiểu dữ liệu của từng giá trị được lưu trữ trong val
cột.
SELECT
id,
val,
typeof(val)
FROM
test_datatypes;
Code language: SQL (Structured Query Language) (sql)
Bạn có thể hỏi cách SQLite sắp xếp dữ liệu trong một cột có các lớp lưu trữ khác nhau như cột val ở trên.
Để giải quyết vấn đề này, SQLite cung cấp bộ quy tắc sau khi sắp xếp:
- Lớp lưu trữ NULL có giá trị thấp nhất. Nó thấp hơn bất kỳ giá trị nào khác. Giữa các giá trị NULL, không có thứ tự.
- Các lớp lưu trữ cao hơn tiếp theo là INTEGER và REAL. SQLite so sánh INTEGER và REAL về mặt số học.
- Lớp lưu trữ cao hơn tiếp theo là TEXT. SQLite sử dụng đối chiếu các giá trị TEXT khi nó so sánh các giá trị TEXT.
- Lớp lưu trữ cao nhất là BLOB. SQLite sử dụng hàm C
memcmp()
để so sánh các giá trị BLOB.
Khi bạn sử dụng ORDER BY
mệnh đề sắp xếp dữ liệu trong một cột với các lớp lưu trữ khác nhau, SQLite thực hiện các bước sau:
- Đầu tiên, hãy nhóm các giá trị dựa trên lớp lưu trữ:NULL, INTEGER và REAL, TEXT và BLOB.
- Thứ hai, sắp xếp các giá trị trong mỗi nhóm.
Câu lệnh sau đây sắp xếp dữ liệu hỗn hợp trong val
cột của test_datatypes
bảng:
SELECT
id,
val,
typeof(val)
FROM
test_datatypes
ORDER BY val;
Code language: SQL (Structured Query Language) (sql)
Mối quan hệ nhập &nhập tệp kê khai SQLite
Các khái niệm quan trọng khác liên quan đến kiểu dữ liệu SQLite là kiểu nhập tệp kê khai và kiểu mối quan hệ:
- Nhập tệp kê khai có nghĩa là kiểu dữ liệu là thuộc tính của giá trị được lưu trữ trong một cột, không phải thuộc tính của cột trong đó giá trị được lưu trữ. SQLite sử dụng cách nhập tệp kê khai để lưu trữ các giá trị thuộc bất kỳ loại nào trong một cột.
- Loại sở thích của một cột là loại được khuyến nghị cho dữ liệu được lưu trữ trong cột đó. Lưu ý rằng loại dữ liệu được khuyến nghị, không bắt buộc, do đó, một cột có thể lưu trữ bất kỳ loại dữ liệu nào.
Trong hướng dẫn này, bạn đã học về các kiểu dữ liệu SQLite và một số khái niệm quan trọng bao gồm các lớp lưu trữ, cách nhập tệp kê khai và kiểu mối quan hệ.