- Cơ Sở Dữ Liệu
- Kiến thức bổ trợ
Các kiểu dữ liệu trong SQLServer14/04/2020 Để 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 numericsSố nguyên (integer) bigint, int, smallint và tinyintCá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à numericDữ 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õ. Transact-SQL1 2 3 4 5 6 | DECLARE @num decimal(4, 2) SET @num = 9.959 SELECT @num -- Kết quả: 9.96 |
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. Transact-SQL1 2 3 4 5 6 7 | DECLARE @num decimal(4, 2) SET @num = 100 SELECT @num -- Kết quả: Arithmetic overflow error converting numeric to data type numeric. |
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à smallmoneyDù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 |
bitMộ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 numericsLà 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 real và float. 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 timetimeDù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
dateDù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
datetimeBiể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 |
smalldatetimeBiể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 |
datetime2Biể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
|
datetimeoffsetKiể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 stringsCá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ả).
Transact-SQL1 2 3 4 5 6 | DECLARE @my_str CHAR(3) SET @my_str = 'ab' SELECT DATALENGTH(@my_str), LEN(@my_str) -- Kết quả: 3 - 2 |
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.
1 2 3 4 5 6 | DECLARE @my_str VARCHAR(3) SET @my_str = 'ab' SELECT DATALENGTH(@my_str), LEN(@my_str) -- Kết quả: 2 - 2 |
textDù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 stringsCá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.
ntextDù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ácNgoà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 stringsBao gồm các kiểu dữ liệu: Other data typesBao gồm các kiểu dữ liệu: - cursor
- rowversion
- hierarchyid
- uniqueidentifier
- sql_variant
- xml
- Spatial Geometry Types
- Spatial Geography Types
- table
Facebook Twitter Pinterest Linkedin Telegram
|