xDuLieu ⮞Cơ sở dữ liệu ⮞Ngôn ngữ SQL ⮞Các kiểu dữ liệu trong SQL
Các kiểu dữ liệu trong SQL
Giới thiệu
Để có thể làm việc hiệu quả với cơ sở dữ liệu, đặc biệt trong giai đoạn thiết kế, các hiểu biết về kiểu dữ liệu đóng một vai trò quan trọng. Vì kiểu dữ liệu liên quan đến cấp phát bộ nhớ và sử dụng các thanh ghi của phần cứng nên nó sẽ ảnh hưởng đến tốc độ xử lý. Ngoài ra, thao tác trên các kiểu dữ liệu khác nhau sẽ không giống nhau, phép cộng giữa hai số 101 và 110 sẽ hoàn toàn khác với phép cộng hai chuỗi ký tự "101" và "110", và cũng sẽ hoàn toàn khác với phép cộng hai chuỗi bit "101" và "110".
SQL có khả năng làm việc với nhiều kiểu dữ liệu khác nhau. Trong giai đoạn đầu tiên, SQL chỉ chấp nhận những kiểu dữ liệu thông thường như số, chuỗi. Nhưng khi khoa học máy tính phát triển, SQL cũng phát triển theo và có khả năng làm việc với những dữ liệu phi truyền thống như BINARY, BLOB, CLOB.
Bên cạnh các kiểu dữ liệu tiêu chuẩn do ANSI/ISO đễ xuất, mỗi hệ quản trị cơ sở dữ liệu có những thay đổi riêng, thêm bớt một vài kiểu dữ liệu. Vì thế khi áp dụng thực tế, chúng ta cần tham khảo thêm các hướng dẫn của hệ quản trị cơ sở dữ liệu cụ thể.
Trong phần trình bày dưới đây, chủng tôi chỉ đề cập đến các kiểu dữ liệu tiêu chuẩn và thường được sử dụng hơn cả. Đó là:
- kiểu số
- kiểu chuỗi ký tự
- kiểu bool
- kiểu chuỗi bit
- kiểu thời gian
Kiểu số
Cùng với kiểu chuỗi ký tự, kiểu số là kiểu dữ liệu rất phổ thông trong các cơ sở dữ liệu. Kiểu số có thể chia làm hai nhóm là kiểu số đúng và kiểu số gần đúng.
Nhóm các kiểu số đúng (exact numeric) diễn tả giá trị bằng một con số đúng như 257 hay 43,128. Trong nhóm này ta có 5 kiểu sau:
- Kiểu số nguyên INTEGER (có thể viết tắt là INT) được cấp phát 4 byte nên có thể dùng cho các số nguyên có giá trị từ -2.147.483.648 đến 2.147.483.647. Tuy nhiên ta có thể hạn chế giá trị của số nguyên đó bằng cách dùng đối số n trong INTEGER(n) với n là số chữ số (tất nhiên giá trị của số đó phải nằm trong khoảng nêu trên). Thí dụ INTEGER(6).
- Kiểu số nguyên nhỏ SMALLINT được cấp phát 2 byte nên dùng cho các số nguyên có giá trị từ -32.768 đến 32.767.
- Kiểu số nguyên lớn BIGINT được cấp phát 8 byte nên dùng cho các số nguyên có giá trị từ -9.223.372.036.854.775.808 đến 9.223.372.036.854.775.807
- Kiểu số NUMERIC(n, p) dùng cho một số gồm n chữ số trong đó có p chữ số thập phân, nghĩa là p chữ số sau dấu ngăn cách phần nguyên và phần lẻ (trong hệ Anh Mỹ là dấu chấm, đối với chúng ta là dấu phẩy). Thí dụ 1234,56 là NUMERIC(6, 2).
- Kiểu số DECIMAL(n, p) dùng cho một số gồm n chữ số trong đó có p chữ số thập phân. Điểm khác biệt của DECIMAL (so với NUMERIC) là trong quá trình xử lý, kết quả của các phép tính trung gian có thể có số chữ số lớn hơn n. Theo tiêu chuẩn, giá trị tối đa của n và p lần lượt là 38 và 12. Bộ nhớ cấp phát cho một số DECIMAL thay đổi từ 5 đến 17 byte.
Nhóm các kiểu số gần đúng (approximate numeric) thường được dùng để biểu diễn các số rất lớn hay rất nhỏ (gần bằng 0). Chúng được dùng chủ yếu dùng để thể hiện các giá trị trong lĩnh vực khoa học (thí dụ khối lượng electron là 9,1094 × 10- 31). Trong nhóm này ta có 3 kiểu sau:
- Kiểu số REAL, được cấp 4 byte, có thể biểu diễn các số từ -3,4×1038 đến 3,4×1038. Số chữ số thập phân có thể lên đến 8.
- Kiểu số DOUBLE PRECISION, được cấp 8 byte, có thể biểu diễn các số từ 1 × 10- 308 đến 1 × 10308 có đến 53 chữ số.
- Kiểu dấu chấm động FLOAT(n) có n chữ số. Nếu n lớn hơn 24, được cấp 8 byte, ngược lại chỉ cấp 4 byte.
Kiểu chuỗi ký tự
Cũng như kiểu số, kiểu chuỗi ký tự chữ số (alphanumeric), thường được gọi tắt là chuỗi ký tự (string), được dùng rất nhiều trong các cơ sở dữ liệu. Ta có 3 loại chính sau:
- Kiểu chuỗi CHARACTER(n) hay CHAR(n) dùng cho chuỗi có chiều dài cố định là n ký tự, được cấp n byte. Nếu cá thể nào có chiều dài bé hơn thì trong bộ nhớ sẽ thêm vào số khoảng trắng cho đủ n byte.
- Kiểu chuỗi có chiều dài thay đổi CHARACTER VARYING(n) hay VARCHAR(n). Số byte được cấp phụ thuộc chiều dài cụ thể của từng cá thể nhưng không lớn hơn n.
- Một số hệ quản trị cơ sở dữ liệu giới hạn chiều dài tối đa của hai kiểu chuỗi trên. Thí dụ Oracle 11g giới hạn chiều dài cho kiểu CHAR là 2000 ký tự, cho kiểu VARCHAR là 4000 ký tự. Nếu ta muốn lưu chuỗi dài hơn, ta sử dụng kiểu CHARACTER LARGE OBJECT(n) hay CLOB(n).
Trong trường hợp các loại mẫu tự không phải là La tinh như tiếng Nga chẳng hạn, ta có 3 kiểu chuỗi tương ứng là NATIONAL CHARACTER hay NCHAR, NATIONAL CHARACTER VARYING hay NVARCHAR, và NATIONAL CHARACTER LARGE OBJECT hay NCLOB. Khi ấy mỗi ký tự được cấp phát 2 byte.
Kiểu bool
Tên của kiểu dữ liệu này được lấy theo tên của nhà Toán học Geogre Boole. Kiểu dữ liệu này chỉ có 3 giá trị là TRUE, FALSE, và UNKNOWN. Kiểu này thường dùng trong các so sánh, trong các điều kiện.
Kiểu chuỗi bit
Kiểu chuỗi bit BINARY chỉ mới được đưa vào từ SQL:2008. Đó là một chuỗi của các bit, nghĩa là chỉ chứa các ký tự 0 và 1, thí dụ "1001101101011101". Nhóm này gồm các kiểu sau:
- BINARY(n) có chiều dài cố định, được cấp n byte trong bộ nhớ (nghĩa là 8n bit).
- BINARY VARYING(n) hay VARBINARY(n) có chiều dài thay đối từ 0 đến n byte tùy thuộc vào giá trị của dữ liệu cụ thể.
- BINARY LARGE OBJECT hay BLOB được dùng cho những chuỗi bit có chiều dài lớn.
Kiểu dữ liệu về thời gian
SQL cung cấp một số kiểu dữ liệu liên quan đến thời gian. Ta có thể chia các kiểu này làm hai nhóm, nhóm thứ nhất đề cập đến các thời điểm và nhóm thứ hai liên quan đến khoảng cách giữa hai thời điểm.
Trong nhóm thứ nhất, ta có năm kiểu dữ liệu sau:
- Kiểu DATE dùng để lưu trữ ngày tháng năm của dữ liệu. Do trong thực tế, có nhiều cách định dạng kiểu này nên ta cần lưu ý. Theo tiêu chuẩn ANSI/ISO, kiểu này gồm 10 ký tự, trình bày theo thứ tự năm-tháng-ngày theo định dạng nnnn-tt-nn. Thí dụ 2017-05-26
- Kiểu TIME WITHOUT TIMEZONE(n) hay TIME(n) dùng để thể hiện giờ phút giây của một ngày và không lưu ý đến khu vực ghi nhận thời điểm. Định dạng kiểu này là giờ:phút:giây. và theo sau là n chữ số chỉ phần thập phân của giây. Thí dụ 17:42:38.254 (được khai báo là TIME(3)). Nếu ta chỉ khai báo TIME thì xem như ta không sử dụng phần thập phân của giây, SQL sẽ dùng giá trị mặc định cho thông số này là 0. Ta cũng lưu ý là kiểu này sử dụng quy ước ngày 24 giờ nên không có AM hay PM đi kèm.
- Kiểu TIME WITH TIMEZONE(n) dùng để thể hiện giờ phút giây của một ngày và lưu ý đến khu vực ghi nhận thời điểm. Định dạng kiểu này là giờ:phút:giây. và theo sau là n chữ số chỉ phần thập phân của giây giống như trên nhưng thêm vào đó là mã số của khu vực. Bạn có thể tham khảo thêm chi tiết của mã số này tại website timezonedb.com.
- Kiểu ngày giờ TIMESTAMP WITHOUT TIMEZONE(n) là sự phối hợp của kiểu DATE và kiểu TIME WITHOUT TIME ZONE dùng để thể hiện cả ngày và giờ phút giây và không lưu ý đến khu vực ghi nhận thời điểm. Định dạng kiểu này là DATE TIME(n). Thí dụ 2017-05-07 17:42:38.254. Tuy nhiên nếu ta không khai báo n thì trong kiểu này SQL sẽ sử dụng giá trị mặc định của n là một số có 6 chữ số chứ không phải là 0 như trong kiểu TIME.
- Kiểu ngày giờ TIMESTAMP WITH TIMEZONE(n) : ta có thể suy diễn tương tự như trên với sự phối hợp của kiểu DATE và kiểu TIME WITH TIME ZONE.
Nhóm thứ hai liên quan đến dữ liệu chỉ khoảng cách giữa hai thời điểm (INTERVAL), còn gọi là thời gian. Trong nhóm này có hai kiểu:
- kiểu năm-tháng (year-month interval) : thời gian được tính bằng năm, bằng tháng, hay cả hai.
- kiểu ngày-giờ (day-time interval) : thời gian có thể biểu thị bằng ngày, giờ, phút, giây hay một sự kết hợp nào đó.
Khi khai báo kiểu dữ liệu này, ta dùng từ khóa INTERVAL và theo sau là một cụm từ định dạng (qualifier). Trong cụm từ định dạng chứa một trong hai nhóm từ khóa về thời gian (YEAR, MONTH) và (DAY, HOUR, MINUTE, SECOND). Các từ khóa đặt trước phải có thời lượng lớn hơn các từ khóa đi sau, thí dụ YEAR phải đặt trước MONTH, SECOND phải đặt sau HOUR. Thí dụ :
- INTERVAL MONTH
- INTERVAL YEAR(n) TO MONTH
- INTERVAL DAY(n)
- INTERVAL DAY TO MINUTE
- INTERVAL HOUR(n) TO SECOND(p)
Trong các thí dụ trên, n là số chữ số, nếu ta không khai báo, SQL sẽ lầy giá trị mặc định là 2. p là số chữ số thập phân của giây, giá trị mặc định của nó là 0.
Chuyển đổi kiểu dữ liệu
Trong một số trường hợp ta phải đổi kiểu dữ liệu để phù hợp với yêu cầu xử lý, khi đó ta có thể sử dụng hàm CAST của SQL theo cú pháp:
CAST( <cột có kiểu A> AS <kiểu B> )
Thí dụ ta muốn chuyển lương tháng của nhân viên (kiểu INT) sang kiểu chuỗi có 9 ký tự thì ta dùng phát biểu sau :
CAST( Nhan_Vien.LuongThang AS CHAR(9) )
Tuy nhiên để có thể chuyển đổi thì kiểu A phải tương thích với kiểu B, ta không thể dùng hàm CAST để chuyển đổi chuỗi ký tự "ngày 10 tháng 4" ra kiểu DATE được.


