0

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 VARCHAR thành INTEGER khi 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ặc NULL.

  • Ứ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 −231-2^{31} đến 231−12^{31} - 1 Khóa ngoại, số lượng sản phẩm.
BIGINT 8 bytes −263-2^{63} đến 263−12^{63} - 1 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ểu INTEGER. 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 FLOAT trong 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ới n là số ký tự tối đa), hoặc chỉ dùng VARCHAR để độ 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ơn n, 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 gia VN, 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí