Kiểu dữ liệu SQL: Hướng dẫn thiết yếu cho người mới bắt đầu
Nắm vững kiểu dữ liệu SQL trong MySQL, PostgreSQL & SQL Server. Học cách chọn định dạng số, văn bản và ngày phù hợp để tối ưu hiệu năng và tính toàn vẹn dữ liệu.
Khi mới bắt đầu làm việc với SQL, bạn rất dễ xem kiểu dữ liệu như những nhãn đơn giản. Một cột lưu trữ hoặc là số, văn bản, ngày tháng hoặc các kiểu dữ liệu đặc biệt. Nhưng kiểu dữ liệu không chỉ là nhãn. Đó là một tập hợp quy tắc xác định một giá trị là gì dưới góc nhìn của cơ sở dữ liệu.
Trên thực tế, kiểu dữ liệu định hình cách SQL “hiểu” thông tin trong cơ sở dữ liệu của bạn. Nó là tập chỉ dẫn cung cấp cho SQL ngữ cảnh cần thiết để đọc, so sánh và xử lý dữ liệu của bạn một cách chính xác.
Trong hướng dẫn này, chúng ta sẽ xem các nhóm kiểu dữ liệu SQL chính và cách chúng hoạt động trong các hệ quản trị cơ sở dữ liệu khác nhau. Tôi khuyến khích bạn làm theo các ví dụ xuyên suốt bài viết.
Nếu bạn chưa làm việc nhiều với bảng cơ sở dữ liệu trước đây, khóa họcSQL Fundamentals của chúng tôi cung cấp nền tảng rõ ràng, thân thiện với người mới bắt đầu để hiểu cấu trúc của các tập dữ liệu như thế này.
Kiểu dữ liệu SQL là gì?
Một kiểu dữ liệu mô tả định dạng dữ liệu của bạn: các loại giá trị mà một cột có thể chứa, cách những giá trị đó được lưu trữ bên trong, và các phép toán phù hợp để chạy trên chúng.
Điều này có nghĩa lựa chọn kiểu dữ liệu của bạn ảnh hưởng nhiều hơn là chỉ thiết kế bảng. Nó có thể tác động đến nhu cầu lưu trữ, hiệu năng truy vấn, cách sắp xếp, phép toán số học, và thậm chí cách các hệ thống khác nhau diễn giải cùng một giá trị.
Dưới đây là một bảng đơn giản sử dụng đồng thời nhiều kiểu:
CREATETABLE employees (
id INT,
name VARCHAR(50),
start_date DATE,
active BOOLEAN,
salary DECIMAL(10,2));Được hỗ trợ bởi
Mỗi cột trong bảng này xác định loại dữ liệu mà nó có thể chứa.
Cột id sẽ lưu số nguyên, cung cấp một mã định danh duy nhất cho mỗi nhân viên.
Cột name có thể chứa tối đa 50 ký tự văn bản, nên bạn có thể lưu tên ngắn.
Cột start_date dành cho ngày theo lịch.
Cột active sẽ lưu giá trị đúng hoặc sai (true/false), giúp dễ dàng theo dõi nhân viên nào hiện đang hoạt động.
Cuối cùng, cột salary sẽ lưu số tiền với độ chính xác 10 chữ số, giữ hai chữ số sau dấu thập phân cho phần xu.
Cùng nhau, các cột này tạo thành một bảng có cấu trúc, áp đặt các quy tắc về loại giá trị nào được phép trong mỗi trường. Điều này khiến dữ liệu có thể dự đoán và dễ làm việc hơn.
Hãy thêm một vài dữ liệu ví dụ và xem bảng kết quả trông như thế nào, sử dụng PostgreSQL.
Các hệ quản trị cơ sở dữ liệu khác nhau tuân theo những nguyên tắc giống nhau nhưng khác biệt về cách đặt tên và tính năng. Ví dụ, SQL Server dùng BIT thay cho BOOLEAN, và MySQL coi BOOLEAN như một số nguyên nhỏ.
Các nhóm kiểu dữ liệu SQL
Có bốn nhóm kiểu dữ liệu chính: số, ký tự, ngày tháng và đặc biệt. Hãy xem chi tiết từng nhóm.
Kiểu dữ liệu số
Các kiểu số lưu trữ số nguyên hoặc số thập phân. Kiểu số cụ thể sẽ quyết định phạm vi, độ chính xác và kích thước lưu trữ của các số được lưu. Những kiểu phổ biến nhất trong nhóm này là:
số nguyên, như INT, SMALLINT và BIGINT, cho số nguyên,
số thập phân, như DECIMAL(p, s) và NUMERIC(p, s), cho giá trị thập phân chính xác,
và số thực dấu phẩy động, như FLOAT và DOUBLE, cho giá trị xấp xỉ có thể phát sinh sai số làm tròn nhỏ
Hãy tạo một bảng ví dụ để minh họa các kiểu dữ liệu số khác nhau:
Như bạn thấy, cột đầu tiên bị ràng buộc là số nguyên, cột thứ hai là số thập phân với hai chữ số sau dấu phẩy, và cột thứ ba là số thập phân với số chữ số sau dấu phẩy không cố định.
Thoạt nhìn, có thể tưởng DECIMAL và FLOAT giống nhau. Nhưng có một khác biệt quan trọng: DECIMAL lưu số chính xác với số chữ số thập phân được chỉ định, trong khi FLOAT giữ giá trị xấp xỉ có thể thay đổi đôi chút giữa các hệ thống.
Điều quan trọng là dùng số thập phân khi cần độ chính xác và chỉ dựa vào số thực dấu phẩy động khi chấp nhận được sai số làm tròn nhỏ.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Số
INT, SMALLINT, BIGINT
Số nguyên với kích thước khác nhau
1, 42, 1000
Số
DECIMAL(p,s), NUMERIC(p,s)
Giá trị thập phân chính xác với độ chính xác cố định
19.99, 250.56
Số
FLOAT, DOUBLE
Giá trị thập phân xấp xỉ. Có thể phát sinh khác biệt làm tròn nhỏ
3.1415, 2.71828
Kiểu dữ liệu ký tự và chuỗi
Các kiểu ký tự lưu trữ văn bản. Có vài kiểu khác nhau với sự khác biệt về hiệu năng và hiệu quả lưu trữ.
CHAR(n) dành cho bộ ký tự độ dài cố định. Hữu ích cho dữ liệu luôn có cùng kích thước, như mã bang hoặc viết tắt sân bay.
VARCHAR(n) dành cho bộ ký tự độ dài biến đổi. Hữu ích cho tên, địa chỉ email và văn bản do người dùng nhập.
TEXT và các kiểu tương tự dùng cho các khối văn bản lớn, không có cấu trúc, như bài blog hoặc mô tả sản phẩm.
Một số hệ thống, như SQL Server, còn hỗ trợ chuỗi Unicode, chẳng hạn NCHAR và NVARCHAR, hữu ích khi dữ liệu của bạn bao gồm văn bản thuộc nhiều hệ chữ viết, như Latin, tiếng Trung hoặc Chữ Kirin.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Ký tự / Chuỗi
CHAR(n)
Văn bản độ dài cố định
'US', 'CA'
Ký tự / Chuỗi
VARCHAR(n)
Văn bản độ dài biến đổi
'Alice Johnson', 'Bob Smith'
Ký tự / Chuỗi
TEXT
Các khối văn bản lớn, không có cấu trúc
'Preferred contact by email.', 'Requires invoice copy for each order.'
Ký tự / Chuỗi
NCHAR(n), NVARCHAR(n)
Văn bản Unicode độ dài cố định hoặc biến đổi
'Å', 'É', 'München', 'São Paulo'
Hãy xem điều này trông thế nào với một bảng ví dụ minh họa các kiểu chuỗi khác nhau:
CREATETABLE customers (
id INT,
country_code CHAR(2),
name VARCHAR(100),
notes TEXT);INSERTINTO customers VALUES(1,'US','Alice Johnson','Preferred contact by email.'),(2,'CA','Bob Smith','Requires invoice copy for each order.');SELECT*FROM customers;Được hỗ trợ bởi
Bảng này rốt cuộc sẽ trông như sau. Bạn có thể thấy sự khác biệt về độ dài được mã hóa trong mỗi kiểu chuỗi.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Ở đây, CHAR(2) buộc độ dài nhất quán, trong khi VARCHAR và TEXT cho phép linh hoạt hơn.
Kiểu dữ liệu ngày và thời gian
Các kiểu ngày và thời gian cho phép lưu trữ và truy vấn thông tin thời gian một cách chính xác. Người mới có thể nghĩ rằng họ có thể dùng kiểu số hoặc chuỗi để mã hóa dạng thông tin này. Tuy nhiên, làm vậy có thể gây vấn đề ở các bước phân tích sau. Việc dùng kiểu dữ liệu lịch cụ thể có thể giúp mọi thứ trôi chảy hơn.
Ba kiểu được dùng phổ biến nhất là:
DATE, mã hóa năm, tháng và ngày,
TIME, lưu giờ, phút và giây,
và DATETIME hoặc TIMESTAMP, lưu ngày và giờ kết hợp.
Các cơ sở dữ liệu hiện đại thậm chí còn hỗ trợ phần giây hoặc kiểu dữ liệu có nhận biết múi giờ, như TIMESTAMPTZ trong PostgreSQL, kiểu này lưu dấu thời gian theo UTC và tự động chuyển đổi sang múi giờ của phiên làm việc khi trích xuất.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Ngày / Thời gian
DATE
Ngày theo lịch (năm, tháng, ngày)
'2025-11-26'
Ngày / Thời gian
TIME
Thời gian trong ngày (giờ, phút, giây)
'09:30:00', '18:45:30'
Ngày / Thời gian
DATETIME, TIMESTAMP
Ngày và giờ kết hợp
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Ngày / Thời gian
TIMESTAMPTZ
Ngày và giờ kết hợp kèm múi giờ (PostgreSQL)
'2025-11-21 09:00:00+00'
Hãy tạo một bảng đơn giản để minh hoạ các kiểu dữ liệu thời gian này:
CREATETABLE events (
event_id INT,
event_date DATE,
start_time TIME,
created_at DATETIME);INSERTINTO events VALUES(1,'2025-11-26','09:30:00','2025-11-20 14:15:00'),(2,'2025-12-01','18:45:30','2025-11-21 09:00:00');SELECT*FROM events;Được hỗ trợ bởi
Bảng sẽ trông như sau:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Bạn có thể thấy việc chọn đúng kiểu ngày hoặc dấu thời gian ảnh hưởng đến loại dữ liệu có thể lưu trữ như thế nào.
Boolean và các kiểu dữ liệu đặc biệt khác
Không phải mọi loại dữ liệu đều vừa vặn với các nhóm trên. Với các trường hợp này, SQL bao gồm một tập các kiểu chuyên dụng cho những tình huống cụ thể. Một số kiểu phổ biến bạn có thể gặp gồm:
Giá trị Boolean (BOOLEAN, BOOL hoặc BIT, tùy hệ thống) để ghi nhận đúng hoặc sai,
Dữ liệu nhị phân (BLOB) cho hình ảnh, tệp, hoặc đối tượng tuần tự hóa,
Văn bản lớn (CLOB) cho tài liệu kích thước đầy đủ,
JSON (trong MySQL và PostgreSQL) cho dữ liệu không lược đồ hoặc lồng nhau
ARRAY (chỉ trong PostgreSQL) cho danh sách
UUID cho mã định danh duy nhất không phụ thuộc vào chuỗi số, như mã phiên hoặc mã theo dõi toàn cục.
Các kiểu đặc biệt cho phép bạn lưu trữ dữ liệu phong phú hoặc linh hoạt hơn khi các bảng truyền thống không nắm bắt được cấu trúc.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Đặc biệt / Boolean / Khác
BOOLEAN, BOOL, BIT
Giá trị đúng hoặc sai
TRUE, FALSE
Đặc biệt / Boolean / Khác
BLOB
Đối tượng nhị phân lớn (hình ảnh, tệp)
[binary image data]
Đặc biệt / Boolean / Khác
CLOB
Tài liệu văn bản lớn
'Full contract text...'
Đặc biệt / Boolean / Khác
JSON
Dữ liệu có cấu trúc hoặc lồng nhau
'{"name": "Alice"}'
Đặc biệt / Boolean / Khác
ARRAY
Danh sách giá trị (chỉ PostgreSQL)
[1,2,3]
Đặc biệt / Boolean / Khác
UUID
Mã định danh duy nhất toàn cục
'550e8400-e29b-41d4-a716-446655440000'
Kiểu dữ liệu SQL trên các hệ thống khác nhau
Các hệ quản trị cơ sở dữ liệu khác nhau ở chi tiết cách chúng sử dụng các kiểu dữ liệu này. Dù các nhóm lớn vẫn giống nhau, tên gọi và hành vi cụ thể lại khác giữa các hệ thống.
Mỗi hệ thống thiết kế kiểu dữ liệu theo ưu tiên riêng, đó là lý do hành vi của chúng khác nhau. Một số khác biệt nhỏ, như từ khóa chính xác được dùng. Số khác ảnh hưởng đến hành vi dữ liệu trong thực tế, như giới hạn độ dài văn bản, cách lưu trữ boolean, hoặc việc hệ thống có hỗ trợ định dạng chuyên biệt hay không.
MySQL nhấn mạnh tốc độ và sự đơn giản, nên dùng những lựa chọn thực tế, nhẹ như TINYINT (về kỹ thuật được lưu như số) cho giá trị Boolean. Nó ưu tiên hiệu năng và khả năng tương thích rộng thay vì ngữ nghĩa kiểu dữ liệu nghiêm ngặt.
PostgreSQL hướng đến tuân thủ tiêu chuẩn và khả năng mở rộng. Điều này thể hiện ở việc nó dùng kiểu BOOLEAN “thực” và có tập lựa chọn kiểu dữ liệu phong phú hơn, như ARRAY và JSONB để lưu trữ dữ liệu có cấu trúc hoặc lồng nhau trực tiếp trong một cột.
SQL Server được xây dựng cho hiệu năng có thể dự đoán trong môi trường doanh nghiệp và tích hợp sâu với hệ sinh thái của Microsoft. Vì vậy, nó cung cấp các kiểu được định nghĩa chặt như BIT cho Boolean và VARCHAR(MAX) cho văn bản lớn.
Bảng dưới đây cho cái nhìn so sánh về cách ba hệ SQL lớn triển khai các khái niệm chung.
Khái niệm
MySQL
PostgreSQL
SQL Server
Số (số nguyên)
Dùng INT cho số nguyên mục đích chung
Dùng INTEGER cho số nguyên
Dùng INT cho số nguyên
Số thập phân/độ chính xác cố định
Dùng DECIMAL(p, s) cho giá trị số chính xác
Dùng NUMERIC(p, s) cho lưu trữ chính xác tuyệt đối
Dùng DECIMAL(p, s) cho giá trị số chính xác
Chuỗi văn bản độ dài tiêu chuẩn
Dùng VARCHAR(n) cho văn bản độ dài biến đổi
Dùng VARCHAR(n) cho văn bản độ dài biến đổi
Dùng VARCHAR(n) cho văn bản độ dài biến đổi
Lưu trữ văn bản lớn
Dùng TEXT cho trường văn bản dài
Dùng TEXT cho trường văn bản dài
Dùng VARCHAR(MAX) cho trường văn bản dài
Giá trị Boolean
Lưu boolean dưới dạng TINYINT(1) (0 hoặc 1)
Dùng BOOLEAN bản địa (true/false)
Dùng BIT (0 hoặc 1) cho dữ liệu dạng boolean
Khóa chính tự tăng
Dùng từ khóa AUTO_INCREMENT
Dùng SERIAL hoặc IDENTITY cho số nguyên tự sinh
Dùng IDENTITY cho số nguyên tự sinh
Chuỗi ký tự rất lớn
Dùng LONGTEXT cho văn bản cực lớn
Cho phép VARCHAR rất lớn, hầu như không có giới hạn thực tế
Dùng VARCHAR(MAX) cho văn bản lớn hoặc không giới hạn
Lưu trữ JSON
Hỗ trợ JSON cho dữ liệu JSON có cấu trúc
Hỗ trợ cả JSON (văn bản) và JSONB (tối ưu nhị phân)
Hỗ trợ JSON (lưu dưới dạng văn bản)
Lưu trữ mảng
Không hỗ trợ kiểu mảng
Hỗ trợ ARRAY để lưu danh sách trong một cột
Không hỗ trợ kiểu mảng
Điều này có ý nghĩa gì trong thực tế
Các mục tiêu thiết kế nền tảng của mỗi hệ thống và loại tác vụ chúng được tối ưu để hỗ trợ ảnh hưởng trực tiếp đến cách chúng vận hành.
Những khác biệt này có nghĩa là trong khi nhiều kỹ năng SQL phổ biến có thể chuyển đổi dễ dàng giữa các hệ thống, các chi tiết như kích thước văn bản tối đa, từ khóa tự tăng, hoặc hỗ trợ cấu trúc phức tạp có thể khác nhau.
Nếu bạn chỉ dùng một hệ thống, bạn có thể trở nên thành thạo trong những chi tiết cụ thể của hệ quản trị cơ sở dữ liệu đó. Tuy nhiên, thay đổi công việc hoặc phòng ban có thể yêu cầu bạn chuyển sang hệ quản trị cơ sở dữ liệu khác với các quy tắc khác.
Vì lý do này, khi học SQL, việc nhận ra các khái niệm chung đằng sau các kiểu dữ liệu sẽ hữu ích hơn là chỉ dựa vào chi tiết của một hệ thống duy nhất.
Chọn kiểu dữ liệu phù hợp
Việc chọn kiểu dữ liệu đôi khi rất rõ ràng. Nhưng đôi khi cần suy nghĩ kỹ. Lựa chọn tốt giúp dữ liệu dễ truy vấn, tiết kiệm lưu trữ và tránh lỗi về sau. Nhóm lớn có lẽ sẽ được quyết định bởi loại dữ liệu bạn có.
Dữ liệu số
Ví dụ, giả sử bạn đang lưu dữ liệu đo đạc. Rõ ràng, bạn sẽ muốn dùng một kiểu số, không phải lịch hay chuỗi. Nhưng các phép đo bạn muốn lưu chính xác đến mức nào? Số nguyên có ổn không, hay bạn cần số thập phân? Bạn có muốn số chữ số có nghĩa cố định không?
Sau đó bạn nên cân nhắc lưu trữ và hiệu quả. Chọn kiểu số nguyên nhỏ nhất có thể lưu an toàn dữ liệu của bạn sẽ giúp bảng hiệu quả hơn. Kiểu nhỏ dùng ít bộ nhớ hơn và có thể cải thiện hiệu năng, đặc biệt với bảng lớn. Thông thường, bạn nên chọn kiểu đủ lớn cho phạm vi mong đợi mà không vượt quá xa nhu cầu thực tế.
Khi số nguyên không phù hợp, bạn có thể chọn DECIMAL hoặc FLOAT. Các kiểu dấu phẩy động lưu giá trị xấp xỉ thay vì chính xác, có thể gây lỗi làm tròn trong công việc tài chính, khoa học, hoặc các lĩnh vực yêu cầu độ chính xác cao.
DECIMAL và NUMERIC lưu giá trị chính xác, phù hợp hơn cho bất cứ thứ gì liên quan đến giá hoặc tỷ lệ. Tuy nhiên, DECIMAL thường yêu cầu lưu trữ lớn hơn FLOAT, tùy theo số chữ số thập phân bạn lưu.
Dữ liệu ký tự và chuỗi
Với dữ liệu chuỗi, bạn sẽ muốn nghĩ về độ lớn mỗi đầu vào bạn mong đợi.
Thông thường, bạn nên đặt kích thước trường VARCHAR một cách thực tế thay vì mặc định dùng độ dài tối đa. Giới hạn quá lớn thường không cải thiện tính linh hoạt, nhưng có thể khiến các nhà phát triển sau này hiểu sai về kích thước dữ liệu mong đợi.
Hãy nghĩ về đầu vào kỳ vọng của bạn, như tên, email, hoặc tiêu đề sản phẩm, và đặt kích thước cột cho phù hợp.
Dữ liệu ngày và thời gian
Với dữ liệu lịch, tốt nhất là xác định chính xác bạn đang lưu trữ điều gì.
Nếu bạn chỉ cần ngày hoặc chỉ cần giờ, thường nên dùng DATE hoặc TIME thay vì DATETIME. Những lựa chọn này làm rõ ý định của bạn và giảm khả năng nhầm lẫn về sau. Chúng cũng giúp cơ sở dữ liệu có thêm không gian để tối ưu các truy vấn chỉ-ngày hoặc chỉ-giờ.
Dữ liệu Boolean
Bất cứ khi nào có thể, hãy dùng các kiểu phù hợp với miền dữ liệu như BOOLEAN thay vì các giải pháp tạm như số nguyên hoặc chuỗi. Các kiểu bản địa bao gồm xác thực tích hợp, ngữ nghĩa rõ ràng và hỗ trợ từ các hàm cơ sở dữ liệu vốn kỳ vọng những loại dữ liệu cụ thể.
Dưới đây là tóm tắt các mục tiêu lưu trữ dữ liệu phổ biến và các kiểu dữ liệu SQL khuyến nghị để giải quyết chúng.
Mục tiêu
Kiểu dữ liệu khuyến nghị
Lý do
Lưu giá trị số chính xác (tiền, đo lường)
DECIMAL hoặc NUMERIC
Lưu giá trị chính xác, không gặp vấn đề làm tròn của dấu phẩy động
Lưu văn bản ngắn hoặc trung bình
VARCHAR(n)
Lưu trữ hiệu quả với kích thước dự đoán được và độ dài linh hoạt
Lưu văn bản dài, không có cấu trúc
TEXT hoặc CLOB
Thiết kế cho các khối văn bản như mô tả hoặc tài liệu
Lưu thông tin chỉ-ngày hoặc chỉ-giờ
DATE hoặc TIME
Tránh phức tạp không cần thiết và phản ánh đúng ý nghĩa dữ liệu
Lưu các giá trị linh hoạt dạng tài liệu
JSON hoặc JSONB
Hữu ích cho cấu trúc lồng nhau hoặc đang phát triển, không phù hợp với cột cố định
Đối với những độc giả muốn ôn lại cách nhóm và lọc dữ liệu, khóa họcIntermediate SQL sẽ hướng dẫn qua những kỹ năng cốt lõi đó.
Lỗi thường gặp và thực hành tốt
Ngay cả một lược đồ cơ sở dữ liệu đơn giản cũng có thể gặp vấn đề nếu kiểu dữ liệu không được chọn cẩn thận.
Cắt cụt dữ liệu
Ví dụ, nếu bạn có một cột tên chỉ cho phép 5 ký tự, bạn có thể nhận được “Micha” thay vì “Michael”. Đây là vấn đề phổ biến gọi là cắt cụt dữ liệu.
Nó thường xuất hiện ở các trường như tên, địa chỉ hoặc bình luận, nơi sự biến thiên trong thực tế có thể vượt quá một giới hạn quá lạc quan. Một cách để tránh là đặt kích thước trường văn bản dựa trên ví dụ thực tế hoặc nghiêng về phương án hơi dài hơn một chút.
Lỗi làm tròn
Một vấn đề phổ biến khác là việc làm tròn ngoài ý muốn khi dùng giá trị dấu phẩy động cho tiền bạc hoặc dữ liệu cần độ chính xác cao. Bởi vì FLOAT lưu giá trị xấp xỉ, các sai lệch nhỏ có thể tích lũy và ảnh hưởng tới báo cáo, tóm tắt hoặc tính toán.
Bạn có thể ngăn điều này bằng cách chọn DECIMAL cho bất cứ thứ gì liên quan đến tiền tệ hoặc giá trị thập phân chính xác. Điều này sẽ đảm bảo cơ sở dữ liệu giữ số liệu ổn định.
Không khớp kiểu
Không khớp kiểu cũng có thể dẫn đến truy vấn chậm, đặc biệt trong phép nối hoặc so sánh.
Khi một cột được lưu dưới dạng chuỗi và cột khác là số nguyên (hoặc khi mỗi bảng dùng kiểu hơi khác nhau), và bạn cố nối chúng, cơ sở dữ liệu có thể phải chuyển đổi giá trị khi chạy. Điều này có thể dẫn đến lỗi và thêm chi phí xử lý không cần thiết.
Giữ cho các cột liên quan đồng nhất về kiểu giúp tránh các chuyển đổi ngầm này và giúp truy vấn chạy mượt hơn.
Định dạng ngày
Ngày theo lịch có cả một chuỗi vấn đề riêng.
Sự không nhất quán trong định dạng ngày là nguồn gây nhầm lẫn hàng đầu khi các hệ thống trộn lẫn quy ước địa phương hoặc khi nhà phát triển lưu ngày dưới dạng chuỗi thay vì dùng kiểu ngày phù hợp. Những bất nhất này có thể khiến truy vấn hoạt động sai hoặc âm thầm trả về kết quả không chính xác.
Cách khắc phục đơn giản là dùng các kiểu ngày thực sự và bám sát một định dạng nhất quán, rõ ràng khi làm việc với ngày ở dạng văn bản. Tôi rất khuyến nghị khóa học Time Series Analysis in SQL Server để giúp tránh các vấn đề lịch phổ biến nhất trong cơ sở dữ liệu của bạn.
Thực hành tốt
Dưới đây là một vài thực hành tốt để đảm bảo cơ sở dữ liệu của bạn vận hành trơn tru:
Điền dữ liệu mẫu vào các bảng sớm trong quá trình thiết kế để bộc lộ điểm yếu về lựa chọn kích thước hoặc kiểu.
Tài liệu hóa mục đích và phạm vi mong đợi của từng cột để các thay đổi sau này không gây không khớp.
Tránh dùng các kiểu chung chung khi những kiểu cụ thể hơn có thể cải thiện tính rõ ràng.
Kết luận
Kiểu dữ liệu xác định cách cơ sở dữ liệu của bạn “hiểu” các giá trị bạn lưu. Chúng ảnh hưởng đến mọi thứ từ lưu trữ đến hiệu năng và tính rõ ràng. Học cách chúng hoạt động giúp cơ sở dữ liệu của bạn đáng tin cậy và có thể dự đoán hơn.
Một kiểu dữ liệu trong SQL xác định loại dữ liệu một cột có thể lưu và cách dữ liệu đó ứng xử khi được truy vấn hoặc xử lý. Nó ảnh hưởng đến lưu trữ, xác thực, sắp xếp, so sánh và các phép toán số học.
SQL Data Types FAQa
What is a data type in SQL?⌄
Một kiểu dữ liệu trong SQL là một tập quy tắc cho SQL biết hệ thống nên mong đợi loại thông tin nào trong cột cơ sở dữ liệu của bạn. Về bản chất, đó là cách hệ thống của bạn “hiểu” dữ liệu.
How do I set a column to be a specific data type in SQL?⌄
Khi bạn định nghĩa một cột trong SQL, bạn sẽ xác định kiểu dữ liệu ngay sau khi đặt tên cột. Nó sẽ trông như thế này: name DATATYPE. Bạn cũng có thể dùng lệnh ALTER COLUMN để cập nhật kiểu dữ liệu trong một cột đã được định nghĩa.
Why do I need to pick the right data type?⌄
Chọn kiểu dữ liệu phù hợp nhất cho dữ liệu của bạn sẽ làm rõ bạn có loại dữ liệu gì, đảm bảo lưu trữ và sử dụng đúng cách, và ngăn lỗi trong mã của bạn về sau.
What is the difference between a DECIMAL and a FLOAT?⌄
DECIMAL là một kiểu dữ liệu số chính xác, lưu số với số chữ số thập phân cố định. Ngược lại, FLOAT là kiểu dữ liệu lưu một giá trị xấp xỉ của con số.
Do all database management systems use the same data types?⌄
Có mà cũng không. Mỗi hệ quản trị cơ sở dữ liệu có các kiểu dữ liệu tương tự cho dữ liệu số, ký tự và lịch. Nhưng chúng khác nhau ở tên gọi cụ thể, cách sử dụng bên trong, và các kiểu dữ liệu đặc biệt mà chúng hỗ trợ.
Tôi là Tiến sĩ với 13 năm kinh nghiệm làm việc với dữ liệu trong môi trường nghiên cứu sinh học. Tôi phát triển phần mềm bằng nhiều ngôn ngữ lập trình, bao gồm Python, MATLAB và R. Tôi đam mê chia sẻ tình yêu học hỏi của mình với mọi người.
Nắm vững các kiến thức cơ bản về SQL cần thiết cho công việc kinh doanh, học cách viết các truy vấn SQL và bắt đầu phân tích dữ liệu của bạn bằng ngôn ngữ mạnh mẽ này.
Khi mới bắt đầu làm việc với SQL, bạn rất dễ xem kiểu dữ liệu như những nhãn đơn giản. Một cột lưu trữ hoặc là số, văn bản, ngày tháng hoặc các kiểu dữ liệu đặc biệt. Nhưng kiểu dữ liệu không chỉ là nhãn. Đó là một tập hợp quy tắc xác định một giá trị là gì dưới góc nhìn của cơ sở dữ liệu.
Trên thực tế, kiểu dữ liệu định hình cách SQL “hiểu” thông tin trong cơ sở dữ liệu của bạn. Nó là tập chỉ dẫn cung cấp cho SQL ngữ cảnh cần thiết để đọc, so sánh và xử lý dữ liệu của bạn một cách chính xác.
Trong hướng dẫn này, chúng ta sẽ xem các nhóm kiểu dữ liệu SQL chính và cách chúng hoạt động trong các hệ quản trị cơ sở dữ liệu khác nhau. Tôi khuyến khích bạn làm theo các ví dụ xuyên suốt bài viết.
Nếu bạn chưa làm việc nhiều với bảng cơ sở dữ liệu trước đây, khóa học SQL Fundamentals của chúng tôi cung cấp nền tảng rõ ràng, thân thiện với người mới bắt đầu để hiểu cấu trúc của các tập dữ liệu như thế này.
Kiểu dữ liệu SQL là gì?
Một kiểu dữ liệu mô tả định dạng dữ liệu của bạn: các loại giá trị mà một cột có thể chứa, cách những giá trị đó được lưu trữ bên trong, và các phép toán phù hợp để chạy trên chúng.
Điều này có nghĩa lựa chọn kiểu dữ liệu của bạn ảnh hưởng nhiều hơn là chỉ thiết kế bảng. Nó có thể tác động đến nhu cầu lưu trữ, hiệu năng truy vấn, cách sắp xếp, phép toán số học, và thậm chí cách các hệ thống khác nhau diễn giải cùng một giá trị.
Dưới đây là một bảng đơn giản sử dụng đồng thời nhiều kiểu:
Mỗi cột trong bảng này xác định loại dữ liệu mà nó có thể chứa.
Cột
idsẽ lưu số nguyên, cung cấp một mã định danh duy nhất cho mỗi nhân viên.Cột
namecó thể chứa tối đa 50 ký tự văn bản, nên bạn có thể lưu tên ngắn.Cột
start_datedành cho ngày theo lịch.Cột
activesẽ lưu giá trị đúng hoặc sai (true/false), giúp dễ dàng theo dõi nhân viên nào hiện đang hoạt động.Cuối cùng, cột
salarysẽ lưu số tiền với độ chính xác 10 chữ số, giữ hai chữ số sau dấu thập phân cho phần xu.Cùng nhau, các cột này tạo thành một bảng có cấu trúc, áp đặt các quy tắc về loại giá trị nào được phép trong mỗi trường. Điều này khiến dữ liệu có thể dự đoán và dễ làm việc hơn.
Hãy thêm một vài dữ liệu ví dụ và xem bảng kết quả trông như thế nào, sử dụng PostgreSQL.
id
name
start_date
active
salary
1
Alice Johnson
2025-01-15
TRUE
55000.00
2
Bob Smith
2024-06-01
FALSE
62000.50
Các hệ quản trị cơ sở dữ liệu khác nhau tuân theo những nguyên tắc giống nhau nhưng khác biệt về cách đặt tên và tính năng. Ví dụ, SQL Server dùng
BITthay choBOOLEAN, và MySQL coiBOOLEANnhư một số nguyên nhỏ.Các nhóm kiểu dữ liệu SQL
Có bốn nhóm kiểu dữ liệu chính: số, ký tự, ngày tháng và đặc biệt. Hãy xem chi tiết từng nhóm.
Kiểu dữ liệu số
Các kiểu số lưu trữ số nguyên hoặc số thập phân. Kiểu số cụ thể sẽ quyết định phạm vi, độ chính xác và kích thước lưu trữ của các số được lưu. Những kiểu phổ biến nhất trong nhóm này là:
số nguyên, như
INT,SMALLINTvàBIGINT, cho số nguyên,số thập phân, như
DECIMAL(p, s)vàNUMERIC(p, s), cho giá trị thập phân chính xác,và số thực dấu phẩy động, như
FLOATvàDOUBLE, cho giá trị xấp xỉ có thể phát sinh sai số làm tròn nhỏHãy tạo một bảng ví dụ để minh họa các kiểu dữ liệu số khác nhau:
Bảng kêt quả sẽ trông như sau:
product_id
price
measurement
1
19.99
3.1415
2
250.56
2.71828
Như bạn thấy, cột đầu tiên bị ràng buộc là số nguyên, cột thứ hai là số thập phân với hai chữ số sau dấu phẩy, và cột thứ ba là số thập phân với số chữ số sau dấu phẩy không cố định.
Thoạt nhìn, có thể tưởng
DECIMALvàFLOATgiống nhau. Nhưng có một khác biệt quan trọng:DECIMALlưu số chính xác với số chữ số thập phân được chỉ định, trong khiFLOATgiữ giá trị xấp xỉ có thể thay đổi đôi chút giữa các hệ thống.Điều quan trọng là dùng số thập phân khi cần độ chính xác và chỉ dựa vào số thực dấu phẩy động khi chấp nhận được sai số làm tròn nhỏ.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Số
INT,SMALLINT,BIGINTSố nguyên với kích thước khác nhau
1, 42, 1000
Số
DECIMAL(p,s),NUMERIC(p,s)Giá trị thập phân chính xác với độ chính xác cố định
19.99, 250.56
Số
FLOAT,DOUBLEGiá trị thập phân xấp xỉ. Có thể phát sinh khác biệt làm tròn nhỏ
3.1415, 2.71828
Kiểu dữ liệu ký tự và chuỗi
Các kiểu ký tự lưu trữ văn bản. Có vài kiểu khác nhau với sự khác biệt về hiệu năng và hiệu quả lưu trữ.
CHAR(n)dành cho bộ ký tự độ dài cố định. Hữu ích cho dữ liệu luôn có cùng kích thước, như mã bang hoặc viết tắt sân bay.VARCHAR(n)dành cho bộ ký tự độ dài biến đổi. Hữu ích cho tên, địa chỉ email và văn bản do người dùng nhập.TEXTvà các kiểu tương tự dùng cho các khối văn bản lớn, không có cấu trúc, như bài blog hoặc mô tả sản phẩm.Một số hệ thống, như SQL Server, còn hỗ trợ chuỗi Unicode, chẳng hạn
NCHARvàNVARCHAR, hữu ích khi dữ liệu của bạn bao gồm văn bản thuộc nhiều hệ chữ viết, như Latin, tiếng Trung hoặc Chữ Kirin.Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Ký tự / Chuỗi
CHAR(n)Văn bản độ dài cố định
'US', 'CA'
Ký tự / Chuỗi
VARCHAR(n)Văn bản độ dài biến đổi
'Alice Johnson', 'Bob Smith'
Ký tự / Chuỗi
TEXTCác khối văn bản lớn, không có cấu trúc
'Preferred contact by email.', 'Requires invoice copy for each order.'
Ký tự / Chuỗi
NCHAR(n),NVARCHAR(n)Văn bản Unicode độ dài cố định hoặc biến đổi
'Å', 'É', 'München', 'São Paulo'
Hãy xem điều này trông thế nào với một bảng ví dụ minh họa các kiểu chuỗi khác nhau:
Bảng này rốt cuộc sẽ trông như sau. Bạn có thể thấy sự khác biệt về độ dài được mã hóa trong mỗi kiểu chuỗi.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Ở đây,
CHAR(2)buộc độ dài nhất quán, trong khiVARCHARvàTEXTcho phép linh hoạt hơn.Kiểu dữ liệu ngày và thời gian
Các kiểu ngày và thời gian cho phép lưu trữ và truy vấn thông tin thời gian một cách chính xác. Người mới có thể nghĩ rằng họ có thể dùng kiểu số hoặc chuỗi để mã hóa dạng thông tin này. Tuy nhiên, làm vậy có thể gây vấn đề ở các bước phân tích sau. Việc dùng kiểu dữ liệu lịch cụ thể có thể giúp mọi thứ trôi chảy hơn.
Ba kiểu được dùng phổ biến nhất là:
DATE, mã hóa năm, tháng và ngày,TIME, lưu giờ, phút và giây,và
DATETIMEhoặcTIMESTAMP, lưu ngày và giờ kết hợp.Các cơ sở dữ liệu hiện đại thậm chí còn hỗ trợ phần giây hoặc kiểu dữ liệu có nhận biết múi giờ, như
TIMESTAMPTZtrong PostgreSQL, kiểu này lưu dấu thời gian theo UTC và tự động chuyển đổi sang múi giờ của phiên làm việc khi trích xuất.Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Ngày / Thời gian
DATENgày theo lịch (năm, tháng, ngày)
'2025-11-26'
Ngày / Thời gian
TIMEThời gian trong ngày (giờ, phút, giây)
'09:30:00', '18:45:30'
Ngày / Thời gian
DATETIME,TIMESTAMPNgày và giờ kết hợp
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Ngày / Thời gian
TIMESTAMPTZNgày và giờ kết hợp kèm múi giờ (PostgreSQL)
'2025-11-21 09:00:00+00'
Hãy tạo một bảng đơn giản để minh hoạ các kiểu dữ liệu thời gian này:
Bảng sẽ trông như sau:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Bạn có thể thấy việc chọn đúng kiểu ngày hoặc dấu thời gian ảnh hưởng đến loại dữ liệu có thể lưu trữ như thế nào.
Boolean và các kiểu dữ liệu đặc biệt khác
Không phải mọi loại dữ liệu đều vừa vặn với các nhóm trên. Với các trường hợp này, SQL bao gồm một tập các kiểu chuyên dụng cho những tình huống cụ thể. Một số kiểu phổ biến bạn có thể gặp gồm:
Giá trị Boolean (
BOOLEAN,BOOLhoặcBIT, tùy hệ thống) để ghi nhận đúng hoặc sai,Dữ liệu nhị phân (
BLOB) cho hình ảnh, tệp, hoặc đối tượng tuần tự hóa,Văn bản lớn (
CLOB) cho tài liệu kích thước đầy đủ,JSON(trong MySQL và PostgreSQL) cho dữ liệu không lược đồ hoặc lồng nhauARRAY(chỉ trong PostgreSQL) cho danh sáchUUIDcho mã định danh duy nhất không phụ thuộc vào chuỗi số, như mã phiên hoặc mã theo dõi toàn cục.Các kiểu đặc biệt cho phép bạn lưu trữ dữ liệu phong phú hoặc linh hoạt hơn khi các bảng truyền thống không nắm bắt được cấu trúc.
Nhóm
Kiểu dữ liệu
Mục đích / Lưu trữ gì
Giá trị ví dụ
Đặc biệt / Boolean / Khác
BOOLEAN,BOOL,BITGiá trị đúng hoặc sai
TRUE, FALSE
Đặc biệt / Boolean / Khác
BLOBĐối tượng nhị phân lớn (hình ảnh, tệp)
[binary image data]
Đặc biệt / Boolean / Khác
CLOBTài liệu văn bản lớn
'Full contract text...'
Đặc biệt / Boolean / Khác
JSONDữ liệu có cấu trúc hoặc lồng nhau
'{"name": "Alice"}'
Đặc biệt / Boolean / Khác
ARRAYDanh sách giá trị (chỉ PostgreSQL)
[1,2,3]
Đặc biệt / Boolean / Khác
UUIDMã định danh duy nhất toàn cục
'550e8400-e29b-41d4-a716-446655440000'
Kiểu dữ liệu SQL trên các hệ thống khác nhau
Các hệ quản trị cơ sở dữ liệu khác nhau ở chi tiết cách chúng sử dụng các kiểu dữ liệu này. Dù các nhóm lớn vẫn giống nhau, tên gọi và hành vi cụ thể lại khác giữa các hệ thống.
Mỗi hệ thống thiết kế kiểu dữ liệu theo ưu tiên riêng, đó là lý do hành vi của chúng khác nhau. Một số khác biệt nhỏ, như từ khóa chính xác được dùng. Số khác ảnh hưởng đến hành vi dữ liệu trong thực tế, như giới hạn độ dài văn bản, cách lưu trữ boolean, hoặc việc hệ thống có hỗ trợ định dạng chuyên biệt hay không.
MySQL nhấn mạnh tốc độ và sự đơn giản, nên dùng những lựa chọn thực tế, nhẹ như
TINYINT(về kỹ thuật được lưu như số) cho giá trị Boolean. Nó ưu tiên hiệu năng và khả năng tương thích rộng thay vì ngữ nghĩa kiểu dữ liệu nghiêm ngặt.PostgreSQL hướng đến tuân thủ tiêu chuẩn và khả năng mở rộng. Điều này thể hiện ở việc nó dùng kiểu
BOOLEAN“thực” và có tập lựa chọn kiểu dữ liệu phong phú hơn, nhưARRAYvàJSONBđể lưu trữ dữ liệu có cấu trúc hoặc lồng nhau trực tiếp trong một cột.SQL Server được xây dựng cho hiệu năng có thể dự đoán trong môi trường doanh nghiệp và tích hợp sâu với hệ sinh thái của Microsoft. Vì vậy, nó cung cấp các kiểu được định nghĩa chặt như
BITcho Boolean vàVARCHAR(MAX)cho văn bản lớn.Bảng dưới đây cho cái nhìn so sánh về cách ba hệ SQL lớn triển khai các khái niệm chung.
Khái niệm
MySQL
PostgreSQL
SQL Server
Số (số nguyên)
Dùng
INTcho số nguyên mục đích chungDùng
INTEGERcho số nguyênDùng
INTcho số nguyênSố thập phân/độ chính xác cố định
Dùng
DECIMAL(p, s)cho giá trị số chính xácDùng
NUMERIC(p, s)cho lưu trữ chính xác tuyệt đốiDùng
DECIMAL(p, s)cho giá trị số chính xácChuỗi văn bản độ dài tiêu chuẩn
Dùng
VARCHAR(n)cho văn bản độ dài biến đổiDùng
VARCHAR(n)cho văn bản độ dài biến đổiDùng
VARCHAR(n)cho văn bản độ dài biến đổiLưu trữ văn bản lớn
Dùng
TEXTcho trường văn bản dàiDùng
TEXTcho trường văn bản dàiDùng
VARCHAR(MAX)cho trường văn bản dàiGiá trị Boolean
Lưu boolean dưới dạng
TINYINT(1)(0 hoặc 1)Dùng
BOOLEANbản địa (true/false)Dùng
BIT(0 hoặc 1) cho dữ liệu dạng booleanKhóa chính tự tăng
Dùng từ khóa
AUTO_INCREMENTDùng
SERIALhoặcIDENTITYcho số nguyên tự sinhDùng
IDENTITYcho số nguyên tự sinhChuỗi ký tự rất lớn
Dùng
LONGTEXTcho văn bản cực lớnCho phép
VARCHARrất lớn, hầu như không có giới hạn thực tếDùng
VARCHAR(MAX)cho văn bản lớn hoặc không giới hạnLưu trữ JSON
Hỗ trợ
JSONcho dữ liệu JSON có cấu trúcHỗ trợ cả
JSON(văn bản) vàJSONB(tối ưu nhị phân)Hỗ trợ
JSON(lưu dưới dạng văn bản)Lưu trữ mảng
Không hỗ trợ kiểu mảng
Hỗ trợ
ARRAYđể lưu danh sách trong một cộtKhông hỗ trợ kiểu mảng
Điều này có ý nghĩa gì trong thực tế
Các mục tiêu thiết kế nền tảng của mỗi hệ thống và loại tác vụ chúng được tối ưu để hỗ trợ ảnh hưởng trực tiếp đến cách chúng vận hành.
Những khác biệt này có nghĩa là trong khi nhiều kỹ năng SQL phổ biến có thể chuyển đổi dễ dàng giữa các hệ thống, các chi tiết như kích thước văn bản tối đa, từ khóa tự tăng, hoặc hỗ trợ cấu trúc phức tạp có thể khác nhau.
Nếu bạn chỉ dùng một hệ thống, bạn có thể trở nên thành thạo trong những chi tiết cụ thể của hệ quản trị cơ sở dữ liệu đó. Tuy nhiên, thay đổi công việc hoặc phòng ban có thể yêu cầu bạn chuyển sang hệ quản trị cơ sở dữ liệu khác với các quy tắc khác.
Vì lý do này, khi học SQL, việc nhận ra các khái niệm chung đằng sau các kiểu dữ liệu sẽ hữu ích hơn là chỉ dựa vào chi tiết của một hệ thống duy nhất.
Chọn kiểu dữ liệu phù hợp
Việc chọn kiểu dữ liệu đôi khi rất rõ ràng. Nhưng đôi khi cần suy nghĩ kỹ. Lựa chọn tốt giúp dữ liệu dễ truy vấn, tiết kiệm lưu trữ và tránh lỗi về sau. Nhóm lớn có lẽ sẽ được quyết định bởi loại dữ liệu bạn có.
Dữ liệu số
Ví dụ, giả sử bạn đang lưu dữ liệu đo đạc. Rõ ràng, bạn sẽ muốn dùng một kiểu số, không phải lịch hay chuỗi. Nhưng các phép đo bạn muốn lưu chính xác đến mức nào? Số nguyên có ổn không, hay bạn cần số thập phân? Bạn có muốn số chữ số có nghĩa cố định không?
Sau đó bạn nên cân nhắc lưu trữ và hiệu quả. Chọn kiểu số nguyên nhỏ nhất có thể lưu an toàn dữ liệu của bạn sẽ giúp bảng hiệu quả hơn. Kiểu nhỏ dùng ít bộ nhớ hơn và có thể cải thiện hiệu năng, đặc biệt với bảng lớn. Thông thường, bạn nên chọn kiểu đủ lớn cho phạm vi mong đợi mà không vượt quá xa nhu cầu thực tế.
Khi số nguyên không phù hợp, bạn có thể chọn
DECIMALhoặcFLOAT. Các kiểu dấu phẩy động lưu giá trị xấp xỉ thay vì chính xác, có thể gây lỗi làm tròn trong công việc tài chính, khoa học, hoặc các lĩnh vực yêu cầu độ chính xác cao.DECIMALvàNUMERIClưu giá trị chính xác, phù hợp hơn cho bất cứ thứ gì liên quan đến giá hoặc tỷ lệ. Tuy nhiên,DECIMALthường yêu cầu lưu trữ lớn hơnFLOAT, tùy theo số chữ số thập phân bạn lưu.Dữ liệu ký tự và chuỗi
Với dữ liệu chuỗi, bạn sẽ muốn nghĩ về độ lớn mỗi đầu vào bạn mong đợi.
Thông thường, bạn nên đặt kích thước trường
VARCHARmột cách thực tế thay vì mặc định dùng độ dài tối đa. Giới hạn quá lớn thường không cải thiện tính linh hoạt, nhưng có thể khiến các nhà phát triển sau này hiểu sai về kích thước dữ liệu mong đợi.Hãy nghĩ về đầu vào kỳ vọng của bạn, như tên, email, hoặc tiêu đề sản phẩm, và đặt kích thước cột cho phù hợp.
Dữ liệu ngày và thời gian
Với dữ liệu lịch, tốt nhất là xác định chính xác bạn đang lưu trữ điều gì.
Nếu bạn chỉ cần ngày hoặc chỉ cần giờ, thường nên dùng
DATEhoặcTIMEthay vìDATETIME. Những lựa chọn này làm rõ ý định của bạn và giảm khả năng nhầm lẫn về sau. Chúng cũng giúp cơ sở dữ liệu có thêm không gian để tối ưu các truy vấn chỉ-ngày hoặc chỉ-giờ.Dữ liệu Boolean
Bất cứ khi nào có thể, hãy dùng các kiểu phù hợp với miền dữ liệu như
BOOLEANthay vì các giải pháp tạm như số nguyên hoặc chuỗi. Các kiểu bản địa bao gồm xác thực tích hợp, ngữ nghĩa rõ ràng và hỗ trợ từ các hàm cơ sở dữ liệu vốn kỳ vọng những loại dữ liệu cụ thể.Dưới đây là tóm tắt các mục tiêu lưu trữ dữ liệu phổ biến và các kiểu dữ liệu SQL khuyến nghị để giải quyết chúng.
Mục tiêu
Kiểu dữ liệu khuyến nghị
Lý do
Lưu giá trị số chính xác (tiền, đo lường)
DECIMALhoặcNUMERICLưu giá trị chính xác, không gặp vấn đề làm tròn của dấu phẩy động
Lưu văn bản ngắn hoặc trung bình
VARCHAR(n)Lưu trữ hiệu quả với kích thước dự đoán được và độ dài linh hoạt
Lưu văn bản dài, không có cấu trúc
TEXThoặcCLOBThiết kế cho các khối văn bản như mô tả hoặc tài liệu
Lưu thông tin chỉ-ngày hoặc chỉ-giờ
DATEhoặcTIMETránh phức tạp không cần thiết và phản ánh đúng ý nghĩa dữ liệu
Lưu các giá trị linh hoạt dạng tài liệu
JSONhoặcJSONBHữu ích cho cấu trúc lồng nhau hoặc đang phát triển, không phù hợp với cột cố định
Đối với những độc giả muốn ôn lại cách nhóm và lọc dữ liệu, khóa học Intermediate SQL sẽ hướng dẫn qua những kỹ năng cốt lõi đó.
Lỗi thường gặp và thực hành tốt
Ngay cả một lược đồ cơ sở dữ liệu đơn giản cũng có thể gặp vấn đề nếu kiểu dữ liệu không được chọn cẩn thận.
Cắt cụt dữ liệu
Ví dụ, nếu bạn có một cột tên chỉ cho phép 5 ký tự, bạn có thể nhận được “Micha” thay vì “Michael”. Đây là vấn đề phổ biến gọi là cắt cụt dữ liệu.
Nó thường xuất hiện ở các trường như tên, địa chỉ hoặc bình luận, nơi sự biến thiên trong thực tế có thể vượt quá một giới hạn quá lạc quan. Một cách để tránh là đặt kích thước trường văn bản dựa trên ví dụ thực tế hoặc nghiêng về phương án hơi dài hơn một chút.
Lỗi làm tròn
Một vấn đề phổ biến khác là việc làm tròn ngoài ý muốn khi dùng giá trị dấu phẩy động cho tiền bạc hoặc dữ liệu cần độ chính xác cao. Bởi vì
FLOATlưu giá trị xấp xỉ, các sai lệch nhỏ có thể tích lũy và ảnh hưởng tới báo cáo, tóm tắt hoặc tính toán.Bạn có thể ngăn điều này bằng cách chọn
DECIMALcho bất cứ thứ gì liên quan đến tiền tệ hoặc giá trị thập phân chính xác. Điều này sẽ đảm bảo cơ sở dữ liệu giữ số liệu ổn định.Không khớp kiểu
Không khớp kiểu cũng có thể dẫn đến truy vấn chậm, đặc biệt trong phép nối hoặc so sánh.
Khi một cột được lưu dưới dạng chuỗi và cột khác là số nguyên (hoặc khi mỗi bảng dùng kiểu hơi khác nhau), và bạn cố nối chúng, cơ sở dữ liệu có thể phải chuyển đổi giá trị khi chạy. Điều này có thể dẫn đến lỗi và thêm chi phí xử lý không cần thiết.
Giữ cho các cột liên quan đồng nhất về kiểu giúp tránh các chuyển đổi ngầm này và giúp truy vấn chạy mượt hơn.
Định dạng ngày
Ngày theo lịch có cả một chuỗi vấn đề riêng.
Sự không nhất quán trong định dạng ngày là nguồn gây nhầm lẫn hàng đầu khi các hệ thống trộn lẫn quy ước địa phương hoặc khi nhà phát triển lưu ngày dưới dạng chuỗi thay vì dùng kiểu ngày phù hợp. Những bất nhất này có thể khiến truy vấn hoạt động sai hoặc âm thầm trả về kết quả không chính xác.
Cách khắc phục đơn giản là dùng các kiểu ngày thực sự và bám sát một định dạng nhất quán, rõ ràng khi làm việc với ngày ở dạng văn bản. Tôi rất khuyến nghị khóa học Time Series Analysis in SQL Server để giúp tránh các vấn đề lịch phổ biến nhất trong cơ sở dữ liệu của bạn.
Thực hành tốt
Dưới đây là một vài thực hành tốt để đảm bảo cơ sở dữ liệu của bạn vận hành trơn tru:
Điền dữ liệu mẫu vào các bảng sớm trong quá trình thiết kế để bộc lộ điểm yếu về lựa chọn kích thước hoặc kiểu.
Tài liệu hóa mục đích và phạm vi mong đợi của từng cột để các thay đổi sau này không gây không khớp.
Tránh dùng các kiểu chung chung khi những kiểu cụ thể hơn có thể cải thiện tính rõ ràng.
Kết luận
Kiểu dữ liệu xác định cách cơ sở dữ liệu của bạn “hiểu” các giá trị bạn lưu. Chúng ảnh hưởng đến mọi thứ từ lưu trữ đến hiệu năng và tính rõ ràng. Học cách chúng hoạt động giúp cơ sở dữ liệu của bạn đáng tin cậy và có thể dự đoán hơn.
Để đọc thêm về chủ đề này, hãy xem SQL Database Overview Tutorial và SQLite Data Types: A Close Look at Storage Classes. Tôi cũng khuyến nghị khóa học PostgreSQL Summary Stats and Window Functions course, khóa học này cho thấy cách tính tổng tích lũy và thống kê có thứ tự.
Một kiểu dữ liệu trong SQL xác định loại dữ liệu một cột có thể lưu và cách dữ liệu đó ứng xử khi được truy vấn hoặc xử lý. Nó ảnh hưởng đến lưu trữ, xác thực, sắp xếp, so sánh và các phép toán số học.