Trino SQL Bài học 7: Các kiểu dữ liệu nguyên thủy (Primitive Types)
Mục tiêu bài học:
-
Hiểu rõ hệ thống kiểu dữ liệu tĩnh và nghiêm ngặt của Trino.
-
Phân loại và ứng dụng đúng các kiểu dữ liệu nguyên thủy: Số, Chuỗi, Logic và Thời gian.
-
Nắm được cách Trino quản lý độ chính xác và cấp phát bộ nhớ cho từng kiểu dữ liệu.
1. Đặc thù hệ thống kiểu dữ liệu của Trino
Trino là một công cụ truy vấn phân tán, nghĩa là nó phải kéo dữ liệu từ nhiều nguồn khác nhau (MySQL, PostgreSQL, MongoDB, Kafka) lên cùng một không gian bộ nhớ (RAM) của các Worker để tính toán.
Để làm được điều này một cách an toàn và tối ưu hiệu năng, Trino sử dụng hệ thống Strongly Typed (Kiểu tĩnh khắt khe).
-
Trino sẽ không tự động ép kiểu (Implicit Cast) giữa các họ dữ liệu khác nhau (ví dụ: không tự động chuyển
VARCHARthànhINTEGERkhi thực hiện phép cộng). -
Các Connector của Trino sẽ làm nhiệm vụ ánh xạ (map) kiểu dữ liệu từ hệ thống gốc sang kiểu dữ liệu chuẩn của Trino.
2. Nhóm kiểu Logic (Boolean)
Kiểu BOOLEAN biểu diễn trạng thái đúng hoặc sai.
-
Giá trị hợp lệ:
TRUE,FALSE, hoặcNULL. -
Ứng dụng: Thường dùng trong các cờ (flags) trạng thái hoặc kết quả trả về của các phép toán so sánh.
SQL
SELECT
custkey,
acctbal > 5000 AS is_vip -- Trả về TRUE hoặc FALSE
FROM tpch.tiny.customer;
3. Nhóm kiểu Số Nguyên (Integer)
Việc chọn đúng kích thước kiểu số nguyên rất quan trọng trong Trino vì nó ảnh hưởng trực tiếp đến lượng RAM mà Worker cần cấp phát khi xử lý hàng tỷ dòng dữ liệu.
| Kiểu dữ liệu | Kích thước | Khoảng giá trị | Ứng dụng phổ biến |
|---|---|---|---|
| TINYINT | 1 byte | -128 đến 127 | Mã trạng thái nhỏ (Status codes), Tuổi. |
| SMALLINT | 2 bytes | -32,768 đến 32,767 | Mã danh mục con. |
| INTEGER (hoặc INT) | 4 bytes | đến | Khóa ngoại, số lượng sản phẩm. |
| BIGINT | 8 bytes | đến | Khóa chính tự tăng (ID), timestamp mili-giây. |
Lưu ý: Khi bạn gõ một số nguyên trực tiếp vào câu query (ví dụ:
SELECT 42), Trino sẽ tự động nội suy nó thành kiểuINTEGER. Nếu số quá lớn, nó sẽ làBIGINT.
4. Nhóm kiểu Số Thực và Số Thập Phân
Khi làm việc với các hệ thống tài chính hoặc số liệu khoa học, việc làm tròn số cần được kiểm soát chặt chẽ.
A. Số thực dấu phẩy động (Floating-Point)
Dùng cho tính toán khoa học hoặc dữ liệu không cần độ chính xác tuyệt đối (gặp hiện tượng sai số làm tròn).
-
REAL: Kích thước 4 bytes (tương đương
FLOATtrong nhiều RDBMS). -
DOUBLE: Kích thước 8 bytes, độ chính xác cao hơn.
B. Số thập phân cố định (Decimal)
Bắt buộc dùng cho dữ liệu tài chính, tiền tệ (Account Balance, Revenue). Khai báo với cú pháp DECIMAL(p, s).
-
p (Precision - Độ chính xác): Tổng số chữ số tối đa (từ 1 đến 38).
-
s (Scale - Phần thập phân): Số lượng chữ số nằm sau dấu phẩy.
SQL
-- Lọc các đơn hàng có doanh thu chính xác tới từng xu
SELECT orderkey, totalprice
FROM tpch.tiny.orders
WHERE CAST(totalprice AS DECIMAL(10, 2)) > 150000.50;
5. Nhóm kiểu Chuỗi (String)
Chuỗi ký tự trong Trino được xử lý theo chuẩn UTF-8.
-
VARCHAR: Kiểu chuỗi có độ dài thay đổi. Bạn có thể chỉ định giới hạn
VARCHAR(n)(vớinlà số ký tự tối đa), hoặc chỉ dùngVARCHARđể độ dài không giới hạn. Đây là kiểu dữ liệu phổ biến nhất cho văn bản. -
CHAR: Kiểu chuỗi độ dài cố định
CHAR(n). Nếu chuỗi truyền vào ngắn hơnn, Trino sẽ tự động thêm các khoảng trắng (spaces) vào cuối để lấp đầy. Chỉ nên dùng khi bạn chắc chắn dữ liệu luôn có độ dài cố định (ví dụ: Mã quốc giaVN,US). -
VARBINARY: Chuỗi byte nhị phân (Binary), thường dùng để lưu trữ file, hình ảnh nhỏ, hoặc dữ liệu mã hóa chưa giải nén.
6. Nhóm kiểu Ngày và Giờ (Date & Time)
Trino hỗ trợ các kiểu dữ liệu thời gian cực kỳ chi tiết, có hoặc không có múi giờ (Timezone). (Chi tiết về các hàm tính toán thời gian sẽ được học chuyên sâu ở Bài 13).
-
DATE: Lưu trữ ngày tháng năm, không có giờ phút giây. Dạng
YYYY-MM-DD. -
TIME: Lưu trữ giờ phút giây, không có ngày. Dạng
HH:MM:SS.SSS. -
TIMESTAMP: Lưu cả ngày và giờ. Ví dụ:
2026-10-10 19:35:40. -
TIMESTAMP WITH TIME ZONE: Lưu ngày, giờ và thông tin múi giờ cụ thể. Rất quan trọng khi truy vấn dữ liệu từ các máy chủ đặt ở nhiều quốc gia khác nhau.
Cú pháp khởi tạo trực tiếp (Literal Initialization): Khác với MySQL, khi bạn muốn so sánh trực tiếp một chuỗi ngày tháng, bạn nên khai báo rõ từ khóa định dạng đằng trước chuỗi (literal prefix) để ép kiểu an toàn:
SQL
SELECT orderkey, orderdate
FROM tpch.tiny.orders
WHERE orderdate = DATE '1995-01-01'; -- Từ khóa DATE đi liền trước chuỗi
Việc định hình đúng kiểu dữ liệu từ đầu sẽ ngăn chặn 90% các lỗi gián đoạn hệ thống (query failures) khi xử lý khối lượng lớn trên Trino.
All rights reserved