Bài viết sẽ giới thiệu tổng quát về các kiểu dữ liệu SQL thường dùng trong các phần mềm cơ sở dữ liệu thông dụng: MySQL , SQL Sever và Oracle.
GIỚI THIỆU
Dữ liệu SQL được lưu trữ dưới dạng các cột và các hàng .Mỗi cột sẽ được gán 1 kiểu dữ liệu và thông tin nhập vào cột đó sẽ được lưu trữ dưới định dạng của kiểu dữ liệu được gán.
Ví dụ:
Cột A có định dạng DATE sẽ lưu trữ dữ liệu dưới định dạng dd/mm/yyyy (dd là ngày , mm là tháng và yyyy là năm),nếu dữ liệu nhập vào sai định dạng này sẽ không được nhận biết và lưu trữ lại.
Tại ví dụ này , phần mềm MySQL thông báo đã thực hiện câu lệnh thành công nhưng khi kiểm tra lại tại cột ngày ( được gán định dạng DATE) , dữ liệu nhập vào sai định dạng và chỉ được ghi nhận dưới dạng 0000-00-00
Còn ở ví dụ này , khi nhập đúng định dạng của dữ liệu là (‘2023-03-01’) khi này mysql sẽ nhận biết và cho phép lưu trữ thông tin vào cột ‘ngày’
Hoặc chúng ta có thể dùng hàm STR_TO_DATE để nhập theo định dạng chúng ta mong muốn mà không gặp phải lỗi định dạng , ví dụ như sau:
INSERT INTO chat(ngày)
VALUES (STR_TO_DATE('01/03/2023','%d/%m/%Y'))
PHÂN LOẠI
Hiện nay , có rất nhiều các loại phần mềm quản trị cơ sở dữ liệu trên thị trường , chính vì vậy tuỳ thuộc vào nhu cầu và thói quen sử dụng của từng doanh nghiệp , từng loại phần mềm sẽ có những quy định về cú pháp cũng như tên gọi riêng cho các kiểu dữ liệu SQL nhưng về căn bản , các phần mềm đều hỗ trợ đầy đủ những kiểu dữ liệu cần thiết để quản trị viên có thể lưu trữ dữ liệu một cách linh hoạt nhất.
Bài viết này sẽ giới thiệu đến người đọc 1 vài các kiểu dữ liệu SQL cơ bản thường được sử dụng trong quá trình khai báo cũng như lưu trữ dữ liệu trên 3 phần mềm quản trị cơ sở dữ liệu thường gặp như là : MySQL , SQL sever và Oracle. Trong nội dung bài viết này , SmartData phân loại các dạng dữ liệu thành 4 dạng cơ bản như sau:
- Ký tự
- Số nguyên
- Số thực
- Thời gian
MYSQL
KIỂU DỮ LIỆU KÝ TỰ
CHAR(N) | là phương thức lưu trữ chuỗi ký tự với độ dài cố định ( có thể chứa các ký tự , số và các ký tự đặc biệt ). Có độ lớn tối đa 255 ký tự và bạn có thể điều chỉnh lượng ký tự được nhập vào bằng phương thức (n), ví dụ : CHAR(10)-sẽ chứa được chuỗi có tối đa 10 ký tự. |
VARCHAR(N) | là phương thức lưu trữ chuỗi ký tự với độ dài linh động ( có thể chứa các ký tự , số và các ký tự đặc biệt ). Có độ lớn tối đa 65535 ký tự , bạn có thể điều chỉnh lượng ký tự được nhập vào bằng phương thức (n), ví dụ : VARCHAR(10)-sẽ chứa được chuỗi có tối đa 10 ký tự. |
TEXT(N) | Lưu trữ 65535 ký tự tối đa |
KIỂU DỮ LIỆU SỐ NGUYÊN
TINYINT(n) | Số nguyên dương : 0 –> 255 , Số nguyên âm : -128 –> 127. Với n là độ rộng hiển thị dãy số. |
SMALLINT | Số nguyên dương : 0 –> 65,535 , Số nguyên âm : -32,768 –> 32,767.Với n là độ rộng hiển thị dãy số. |
MEDIUMINT(n) | Số nguyên dương : 0 –> 167,777,215 , Số nguyên âm : -8,388,608 –> 8,388,607.Với n là độ rộng hiển thị dãy số. |
INT(n)=INTEGER(n) | Số nguyên dương : 0 –> 4,294,967,295 , Số nguyên âm : -2,147,483,648 –> 2,147,483,647.Với n là độ rộng hiển thị dãy số. |
BIGINT(n) | Số nguyên dương : 0 –> 18,446,744,073,709,551,615 , Số nguyên âm : -9,223,372,036,854,775,808 –>9,223,372,036,854,775,807.Với n là độ rộng hiển thị dãy số. |
KIỂU DỮ LIỆU SỐ THỰC
FLOAT(a,b) DOUBLE(a,b) | là 2 dạng lưu trữ cho dữ liệu số thực với mô tả gần đúng các giá trị số thực.MySQL sử dụng 4 byte để lưu trữ FLOAT() và 8 byte để lưu trữ DOUBLE() nên DOUBLE có độ chính xác cao hơn so với FLOAT nhưng sẽ tốn dung lượng lưu trữ nhiều hơn. 2 kiểu dữ liệu này nên được cân nhắc trong trường hợp không cần độ chính xác cao. |
DECIMAL(a,b) NUMERIC(a,b) | cả hai kiểu dữ liệu DECIMAL và NUMERIC được sử dụng để lưu trữ các giá trị số với độ chính xác cao. Ví dụ điển hình cho việc sử dụng 2 loại kiểu dữ liệu này là để lưu trữ thông tin số tiền trong tài khoản ngân hàng. Trong cú pháp (a,b) trong cả 2 loại , a là số lượng tối đa của chữ số ( cả trước và sau và cả dấu thập phân) và b là số lượng số tối đa đứng sau dấu thập phân. Ví dụ: DECIMAL(5,3)/NUMERIC(5,3) của 10/3 là 3,333 |
KIỂU DỮ LIỆU THỜI GIAN
DATE | Dùng để lưu trữ thông tin ngày tháng. Định dạng: YYYY-MM-DD Phạm vi : từ ‘1000-01-01’ đến ‘9999-12-31’ |
TIME | Lưu trữ thông tin giờ Định dạng: hh:mm:ss Phạm vi : từ ‘-838:59:59’ đến ‘838:59:59’ |
DATETIME | Là sự kết hợp của hàm DATE và TIME Định dạng: YYYY-MM-DD hh:mm:ss Phạm vi: từ 1000-01-01 00:00:00′ đến ‘9999-12-31 23:59:59’ |
TIMESTAMP | TIMESTAMP cũng có chức năng tương tự như hàm DATETIME nhưng phạm vi nhỏ hơn (‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC). Một lưu ý khi sử dụng TIMESTAMP là khi lưu trữ Mysql sẽ chuyển thời gian được lưu trữ từ múi giờ của người nhập đến múi giờ UTC . Và khi bạn gọi đến TIMESTAMP đó , Mysql sẽ chuyển đổi từ UTC ngược lại múi giờ đang kết nối của người gọi.Đây là sự khác biệt chính của TIMESTAMP so với DATETIME. |
YEAR(2) or YEAR(4) | Hiển thị số năm với 2 hoặc 4 ký tự Phạm vi 2 ký tự : 0-99 Phạm vi 4 ký tự : 1901-2155 |
SQL SEVER
KIỂU DỮ LIỆU CHUỖI
CHAR(N) | Có độ dài cố định. Tối đa 8000 ký tự |
VARCHAR(N) | Có độ dài tuỳ biến theo N. Tối đa 8000 ký tự |
VARCHAR(MAX) | có độ dài tuỳ biến theo chuỗi kí tự nhập vào.Tối đa 1.073.741.824 ký tự |
TEXT | có độ dài tuỳ biến theo chuỗi kí tự nhập vào.Tối đa 2GB. |
NTEXT | như TEXT nhưng dùng để lưu trữ bảng mã UNICODE |
NCHAR | như CHAR nhưng dùng để lưu trữ bảng mã UNICODE |
NVARCHAR | như VARCHAR nhưng dùng để lưu trữ bảng mã UNICODE |
NVARCHAR(MAX) | như VARCHAR(MAX) nhưng dùng để lưu trữ bảng mã UNICODE |
KIỂU DỮ LIỆU SỐ NGUYÊN
TINYINT | lưu trữ số nguyên từ 0-255 tương đương 1byte |
SMALLINT | lưu trữ số nguyên từ -32,768-32,767 tương đương 2bytes |
INT | lưu trữ số nguyên từ -2,147,483,648-2,147,483,647 tương đương 4 bytes |
BIGINT | lưu trữ số nguyên từ -9,223,372,036,854,775,808-9,223,372,036,854,775,807 tương đương 8 bytes |
KIỂU DỮ LIỆU SỐ THỰC
DECIMAL(P,S) NUMERIC(P,S) | cả hai kiểu dữ liệu DECIMAL và NUMERIC được sử dụng để lưu trữ các giá trị số với độ chính xác cao. Trong cú pháp (P,S) P chỉ tổng số chữ số trước cả sau dấu thập phân , trong đó S chỉ số lượng số sau dấu thập phân |
SMALLMONEY | Đơn vị lưu trữ tiền tệ có giới hạn từ -214,748.3648-214,748.3647 ~ 4 bytes |
MONEY | Đơn vị lưu trữ tiền tệ có giá trị lớn hơn SMALLMONEY từ -922,337,203,685,477.5808-922,337,203,685,477.5807~ 8 bytes |
FLOAT(N) REAL | FLOAT VÀ REAL cũng đều được dùng lưu trữ giá trị thập phân nhưng độ chính xác không cao bằng DECIMAL và NUMERIC. Trong đó FLOAT sử dụng 8 bytes để lưu trữ nên sẽ chính xác hơn REAL với 4 bytes |
KIỂU DỮ LIỆU THỜI GIAN
DATETIME | Lưu trữ thời gian với độ rộng : 1/1/1753 – 31/12/9999 độ chính xác 3.33 miligiây ~ 8Bytes |
DATETIME2 | Lưu trữ thời gian với độ rộng : 1/1/0001 – 31/12/9999 độ chính xác 100 nanogiây~ 6-8Bytes |
SMALLDATETIME | Lưu trữ thời gian với độ rộng : 1/1/1900-6/6/2079 độ chính xác 1 phút ~ 4Bytes |
DATE | Lưu trữ thời gian với độ rộng : 1/1/0001 – 31/12/9999 ~ 3Bytes |
TIME | Lưu trữ giờ/phút/giây(.nnnnnnn) với độ chính xác 100 nanogiây ~ 3-5Bytes |
DATETIMEOFFSET | Kiểu dữ liệu DATETIMEOFFSET được sử dụng để lưu trữ thông tin về thời gian và múi giờ. Độ rộng và độ chính xác tương tự DATETIME2 |
TIMESTAMP | Kiểu dữ liệu TIMESTAMP được sử dụng để lưu trữ thông tin về thời gian đánh dấu thời điểm cuối cùng mà một dòng dữ liệu được thay đổi hoặc chèn vào trong một bảng. Kiểu dữ liệu này được lưu trữ dưới dạng một số nguyên 8 byte và tự động được cập nhật mỗi khi một dòng dữ liệu được thay đổi hoặc chèn vào bảng. Giá trị của TIMESTAMP tăng dần theo thời gian, với độ chính xác đến 3 con số sau dấu thập phân. |
ORACLE
KIỂU DỮ LIỆU KÝ TỰ
NCHAR | NCHAR là một kiểu dữ liệu để lưu trữ các ký tự Unicode giống như NVARCHAR2. Tuy nhiên, NCHAR sử dụng cố định độ dài cho mỗi ký tự (2 byte) và không thể thay đổi được. Do đó, NCHAR được sử dụng để lưu trữ các chuỗi có độ dài cố định như mã số bưu chính, số điện thoại, số CMND. |
NVARCHAR2 | NVARCHAR2 là một kiểu dữ liệu để lưu trữ các ký tự Unicode. Kiểu dữ liệu này cho phép lưu trữ các ký tự đa ngôn ngữ và hỗ trợ nhiều ngôn ngữ, bao gồm cả các ngôn ngữ có chứa các ký tự không phải Latin, chẳng hạn như tiếng Trung, tiếng Nhật, tiếng Hàn… NVARCHAR2 có độ dài tối đa là 4000 ký tự và sử dụng 2 byte cho mỗi ký tự. Tuy nhiên, trong phiên bản Oracle 12c trở lên, độ dài tối đa của NVARCHAR2 có thể tăng lên tới 32767 byte, tương đương với 16383 ký tự Unicode |
VARCHAR2 | VARCHAR2 là một kiểu dữ liệu trong Oracle để lưu trữ các chuỗi ký tự. Đây là một kiểu dữ liệu khá phổ biến trong Oracle và được sử dụng rộng rãi để lưu trữ các chuỗi có độ dài thay đổi. VARCHAR2 có thể lưu trữ tối đa 4000 ký tự. |
VARCHAR | Tương đương với VARCHAR2 , khác biệt duy nhất VARCHAR là dạng ký tự đạt chuẩn ANSI trong khi đó VARCHAR 2 là chuẩn của chỉ riêng ORACLE. |
KIỂU DỮ LIỆU DẠNG SỐ
Ở Oracle, kiểu dữ liệu dạng số được phân chia thành 2 loại cơ bản:
INTEGER | Kiểu dữ liệu Integer được sử dụng để lưu trữ các giá trị số nguyên. Kiểu dữ liệu này có kiểu dữ liệu con là PLS_INTEGER và BINARY_INTEGER.Trong đó, PLS_INTEGER là một kiểu dữ liệu đặc biệt của Oracle, được tối ưu để thực hiện các tính toán số nguyên nhanh hơn và sử dụng bộ nhớ ít hơn so với kiểu dữ liệu số nguyên chuẩn. |
NUMBER | Kiểu dữ liệu Number được sử dụng để lưu trữ các giá trị số, bao gồm cả số nguyên và số thực. Kiểu dữ liệu này có thể được định nghĩa với độ chính xác và tỷ lệ phần trăm theo yêu cầu. Để khai báo một cột với kiểu dữ liệu Number trong Oracle, ta có thể sử dụng cú pháp sau: CREATE TABLE table_name (column_name NUMBER(precision, scale)) Trong đó, precision là tổng số chữ số được lưu trữ và scale là số chữ số sau dấu thập phân. Nếu không có precision hoặc scale được chỉ định, giá trị mặc định là 38. |
KIỂU DỮ LIỆU THỜI GIAN
DATE | Kiểu dữ liệu DATE được sử dụng để đại diện cho một giá trị ngày theo định dạng YYYY-MM-DD. Ví dụ: CREATE TABLE orders ( order_id NUMBER, order_date DATE, customer_id NUMBER, order_total NUMBER) |
TIMESTAMP | Định dạng TIMESTAMP được sử dụng để lưu trữ giá trị ngày tháng và thời gian cụ thể. Ví dụ CREATE TABLE logins ( user_id NUMBER, login_time TIMESTAMP, ip_address VARCHAR2(50)) |
INTERVAL YEAR TO MONTH | Định dạng INTERVAL YEAR TO MONTH được sử dụng để lưu trữ khoảng thời gian tính bằng năm và tháng. Ví dụ: CREATE TABLE contracts ( contract_id NUMBER, start_date DATE, end_date DATE, duration INTERVAL YEAR TO MONTH) |
INTERVAL DAY TO SECOND | Định dạng INTERVAL DAY TO SECOND được sử dụng để lưu trữ khoảng thời gian tính bằng ngày, giờ, phút, giây và mili giây. Ví dụ: CREATE TABLE sessions ( session_id NUMBER, start_time TIMESTAMP, end_time TIMESTAMP, duration INTERVAL DAY TO SECOND, user_id NUMBER) |
TỔNG KẾT
Qua bài viết trên , SmartData đã giới thiệu với các bạn các kiểu dữ liệu SQL thông dụng trên các cơ sở dữ liệu phổ biến MySQL , SQL Sever và Oracle. Hi vọng sẽ cung cấp được thêm những thông tin cần thiết cho các bạn trong quá trình nghiên cứu.
Nếu bạn là newbie có thể tham khảo bài viết này để tìm hiểu lộ trình học DA trong 6 tháng của SmartData.
Nếu bạn thấy bài viết hay và hữu ích, bạn có thể tham gia các kênh sau của SmartData để nhận được nhiều hơn nữa: