Các kiểu dữ liệu trong SQLServer

Để làm việc với CSDL một cách tốt nhất. Trước hết chúng ta cần nắm rõ được các thành phần nhỏ nhất. Chúng chính là các kiểu dữ liệu trong T-SQL.

Exact numerics

Số nguyên (integer) – bigint, int, smallint và tinyint

Các kiểu dữ liệu này dùng để lưu trữ các giá trị sô nguyên. Tuy nhiên, chúng có một số đặc điểm khác nhau (theo mô tả ở bảng so sánh bên đưới). Do đó, khi thiết kế CSDL, chúng ta cần phải áp dụng thực tiễn vào để chọn kiểu dữ liệu phù hợp nhất.

Ví dụ: chúng ta có một bảng dữ liệu lưu thông tin. Đối tượng là con người. Có thuộc tính lưu tuổi. Áp dụng trong thực tiễn, chúng ta thấy được, gần như không có 1 con người nào có số tuổi lớn hơn 255. Do đó, chúng ta chỉ cần kiểu dữ liệu tinyint là quá đủ trong trường hợp này.

Kiểu dữ liệu Khoảng giá trị Kích thước
bigint $-9,223,372,036,854,775,808 \rightarrow 9,223,372,036,854,775,807$

($-2^{63} \rightarrow 2^{63}$

8 bytes
int $-2,147,483,648 \rightarrow 2,147,483,647$

($-2^{31} \rightarrow 2^{31}$)

4bytes
smallint $-32,768 \rightarrow 32,767$

($-2^{15} \rightarrow 2^{15}$)

2 bytes
tinyint $0 \rightarrow 255$ 1 byte

Dữ liệu số (numeric data type) – decimal và numeric

Dữ liệu số, dùng để lưu trữ số thực. Tuy nhiên kích thước phần nguyên và phần thập phân được cố định.

Ví dụ: Chúng ta có một bảng dữ liệu lưu điểm số của các bạn học sinh. Điểm số lưu ở hệ số 10, làm tròn 2 chữ số thập phân. Nghĩa là chúng ta chỉ cần lưu điểm như: 5; 7.5; 9.25..vv Trong những trường hợp này, chúng ta có thể sử dụng dữ liệu kiểu số.

  • Cú pháp: decimal[(p, [,s])] và numeric[p, [,s]] (decimal và numeric có thể dùng thay thế cho nhau).
  • Tham số p (precision): Tổng chữ số dùng để lưu trữ giá trị (gồm cả phần nguyên và phần thập phân).Giá trị của p sẽ nằm trong đoạn [1, 38] và nó nhận 18 làm giá trị mặc định
  • Tham số s (scale): Số chữ số lưu phần thập phân. Giá trị của tham số này nằm trong đoạn [0, p]. Nghĩa là $0 \leq s \leq p$. Giá trị mặc định của nó là 0

Theo ví dụ trên, chúng ta có điểm 1 học sinh có thể từ $0.00 \rightarrow 10.00$ vậy dữ liệu có thể có nhiều nhất 4 chữ số và cần 2 chữ số cho phần thập phân. Lúc này, chúng ta thử nghiệm 1 đoạn truy vấn nhỏ để hiểu rõ.

Theo khai báo, chúng ta chỉ sử dụng 2 chữ số để lưu phần thập phân. Do đó, khi dữ liệu lớn hơn, hệ thống sẽ tự làm tròn và lấy đúng 2 chữ số thập phân.

Trong ví dụ này, dù ta không sử dụng phần thập phân, tuy nhiên theo khai báo ta đã lấy 2 trên tổng số 4 số để lưu trữ phần thập phân. Do đó, chỉ với 2 chữ số, chúng ta không thể lưu trữ được giá trị 100.

Precision Kích thước
1-9 5 bytes
10-19 9 bytes
20-28 13 bytes
28-38 17 bytes

Dữ liệu tiền tệ — money và smallmoney

Dùng để biểu diễn một giá trị về tiền tệ.

Kiểu dữ liệu Khoảng giá trị Kích thước
money $-922,337,203,685,477.5808 \rightarrow 922,337,203,685,477.5807$ 8 bytes
smallmoney $- 214,748.3648 \rightarrow 214,748.3647$ 4 bytes

bit

Một số kiểu bit có thể nhận một trong các giá trị: 1, 0, NULL.

SQLServer Database Engine có cơ chế tối ưu hóa việc lưu trữ các cột có kiểu giá trị bit. Nó sẽ gộp các cột có kiểu giá trị bit lại để lưu trữ chung. Do đó, nếu có từ 1 -> 8 cột  kiểu bit sẽ cần 1 bytes để lưu trữ, 9-16 cột sẽ cần 2 bytes…

Approximate numerics

Là các kiểu dữ liệu để lưu trữ số thực. Các kiểu dữ liệu này sử dụng phương pháp floating point để biểu diễn một số thực. Approximate-number data types bao gồm realfloat. Nhưng thực chất, real chính là float(24).

  • Cú pháp: float[(n)]
  • Tham số n: Kích thước của biến, tương tự float và double trong ngôn ngữ C. Tham số n có giá trị nằm trong đoạn [1, 53] và giá trị mặc định của n là 53.
Giá trị n Precision Kích thước
1-24 7 chữ số 4 bytes
25-53 15 chữ số 8 bytes

Date and time

time

Dùng để biểu diễn một khoảng thời gian trong ngày trên định dạng 24 giờ.

  • Cú pháp: time[(fractional second scale)]
  • Tham số fractional second scale: Số thập phân của giây. Giá trị này nằm trong đoạn [1, 7] và có giá trị mặc định là 7.
  • Khoảng dữ liệu: 00:00:00.0000000 đến 23:59:59.9999999

date

Dùng để biểu diễn một ngày.

  • Cú pháp: date
  • Định dạng mặc định: YYYY-MM-DD
  • Khoảng giá trị: 0001-01-01 đến 9999-12-31

datetime

Biểu diễn ngày và giờ. Giá trị giờ được biểu diễn dưới định dạng 24 giờ. Có thể biểu diễn chi tiết đến phần nghìn của giây (3 chữ số thập phân cho giá trị giây).

Khoảng giá trị ngày January 1, 1753  $\rightarrow$ December 31, 9999
Khoảng giá trị giờ 00:00:00 $\rightarrow$ 23:59:59.997
Khoảng giá trị từng phần tử
  • YYYY: $1753 \rightarrow 9999$
  • MM: $01 \rightarrow 12$
  • DD: $01 \rightarrow 31$ (tùy thuộc vào tháng)
  • hh: $00 \rightarrow 23$
  • mm: $00 \rightarrow 59$
  • ss: $00 \rightarrow 59$
  • n*: $0 \rightarrow 999$
Kích thước

smalldatetime

Biểu diễn ngày và giờ. Giá trị giờ được biểu diễn dưới định dạng 24 giờ. Có thể biểu diễn chi tiết đến phút. Giá trị giây mặc định 00 và không kèm phần thập phân.

Khoảng giá trị ngày January 1, 1753  $\rightarrow$ December 31, 9999
Khoảng giá trị giờ 00:00:00 $\rightarrow$ 23:59:59.997
Khoảng giá trị từng phần tử
  • YYYY: $1753 \rightarrow 9999$
  • MM: $01 \rightarrow 12$
  • DD: $01 \rightarrow 31$ (tùy thuộc vào tháng)
  • hh: $00 \rightarrow 23$
  • mm: $00 \rightarrow 59$
Kích thước 4 bytes

datetime2

Biểu diễn ngày và giờ. Giá trị giờ được biểu diễn dưới định dạng 24 giờ. Tương tự kiểu dữ liệu datetime. Nhưng được mở rộng hơn về khoảng giá trị các phần tử. Cũng như có thể biểu diễn chi tiết hơn phần thập phân của giây.

  • Cú pháp: datetime2[(fractional seconds precision)]
  • Tham số fractional seconds precision: Mô tả độ chính xác của giá trị giây. Giá trị của tham số nằm trong đoạn [0-7]. Giá trị mặc định của tham số là 7
Khoảng giá trị ngày 0001-01-01 $\rightarrow$ 9999-12-31
Khoảng giá trị giờ 00:00:00 $\rightarrow$ 23:59:59.9999999
Khoảng giá trị từng phần tử
  • YYYY: $1753 \rightarrow 9999$
  • MM: $01 \rightarrow 12$
  • DD: $01 \rightarrow 31$ (tùy thuộc vào tháng)
  • hh: $00 \rightarrow 23$
  • mm: $00 \rightarrow 59$
  • ss: $00 \rightarrow 59$
  • n*: $0 \rightarrow 9999999$
Kích thước
  • Nếu precision < 3 thì kích thước 6 bytes
  • Nếu 3 $\leq$ precision $\leq$ 4 thì kích thước 7 bytes
  • Nếu precision > 4 thì kích thước 8 bytes

datetimeoffset

Kiểu dữ liệu datetimeoffset nằm ngoài seri bài viết này. Bạn có thể tham khảo thêm tại trang tài liệu của Microsoft.

Character strings

Các loại kiểu dữ liệu này dùng để lưu trữ các dữ liệu dạng chuỗi. Bao gồm các kiểu:

char

  • Cú pháp: char[(n)]
  • Tham số n: Kích thước của chuỗi, tính bằng bytes. Giá trị của n nằm trong đoạn  [1, 8000].
  • Đặc điểm: kích thước của dữ liệu có kiểu char luôn được cố định. Nghĩa là khi bạn khai báo chiều dài của dữ liệu là 3 bytes, bạn chỉ lưu 1 chuỗi kí tự gồm 2 ký tự ‘ab’ thì byte thứ 3 vẫn được padding cho đủ (dù nó không chứa gì cả).

varchar

  • Cú pháp: varchar([n|max])
  • Tham số n: Kích thước [tối đa] của chuỗi, tính bằng bytes. Giá trị của n nằm trong đoạn  [1, 8000].
  • Giá trị max: là một hằng số, có giá trị $2^{31} -1$ (bytes) = 2GB
  • Đặc điểm: tham số n chỉ mang ý nghĩa giá trị tối đa của chuỗi được lưu trữ. Kích thước dữ liệu bằng với chiều dài của chuỗi dữ liệu.

text

Dùng để lưu trữ các chuỗi dữ liệu không chữa các kí tự unicode. Có thể xem kiểu text tương đương khả năng lưu trữ với varchar(max).

Unicode character strings

Các loại kiểu dữ liệu này dùng để lưu trữ các chuỗi dữ liệu chứa các ký tự unicode. Bao gồm các kiểu:

nchar

  • Cú pháp: nchar[(n)]
  • Tham số n: Kích thước của chuỗi, tính bằng bytes. Giá trị của n nằm trong đoạn [1, 4000]
  • Đặc điểm: nchar sử dụng đến 2bytes để lưu trữ 1 ký tự. Do đó, kích thước dữ liệu luôn gấp đôi giá trị n.

nvarchar

  • Cú pháp: nvarchar[(n|max)]
  • Tham số n: kích thước của chuỗi. Giá trị n nằm trong đoạn [1, 4000]
  • Đặc điểm: nvarchar sử dụng đến 2bytes để lưu trữ 1 ký tự. Do đó, kích thước của dữ liệu luôn gấp đôi kích thước thực của chuỗi.

ntext

Dùng để lưu trữ các chuỗi chứa kí tự unicode. Kích thước tối đa $2^{30}-1$ bytes. Kích thước dữ liệu sẽ gấp 2 lần chiều dài của chuỗi dữ liệu.

Các kiểu dữ liệu khác

Ngoài những kiểu dữ liệu cơ bản trên, SQLServer còn cung cấp cho chúng ta rất nhiều kiểu dữ liệu đặc biệt. Tuy nhiên, những kiểu dữ liệu này nằm ngoài phạm vi của loạt bài viết kế tiếp. Do đó, mình chỉ để link đến tài liệu của Microsoft cho các bạn tham khảo.

Binary strings

Bao gồm các kiểu dữ liệu:

Other data types

Bao gồm các kiểu dữ liệu: