Giới thiệu về các kiểu dữ liệu trong SQL
Không giống như JavaScript, SQL có kiểu gõ mạnh. Trong mỗi bảng, mỗi cột có kiểu dữ liệu cố định riêng.
Có rất nhiều kiểu dữ liệu, nhưng không giống như ngôn ngữ Java, có rất nhiều kiểu dữ liệu không phải vì có kiểu dữ liệu cho mọi trường hợp. Cơ sở dữ liệu phụ thuộc rất nhiều vào kích thước của dữ liệu, vì vậy nhiều loại dữ liệu chỉ khác nhau về độ dài.
Tổng cộng, các loại dữ liệu có thể được chia thành 5 nhóm:
- các loại số
- các loại chuỗi
- Các kiểu lưu trữ ngày giờ
- Đối tượng: thường được biểu diễn dưới dạng tập hợp các byte
- Vận chuyển : JSON và XML
Thông thường các DBMS khác nhau vẫn có kiểu dữ liệu riêng. Mỗi DBMS có chuyên môn riêng, vì vậy việc thêm các kiểu dữ liệu mới là một điều rất phổ biến.
Một điều nữa là chỉ thêm một kiểu dữ liệu mới là chưa đủ, bạn cần thêm các chức năng sẽ hoạt động với nó, cũng như giúp công việc này trở nên thuận tiện và nhanh chóng.
Nếu bạn làm việc trên bất kỳ DBMS công nghiệp (doanh nghiệp) nào, thì rất có thể bạn sẽ phải xử lý các kiểu dữ liệu và chức năng của nó. Để làm gì, bạn cần đọc 2-5 cuốn sách hay.
Là một phần trong quá trình làm quen với SQL, chúng ta sẽ xem xét ba nhóm kiểu dữ liệu chính:
- số
- Dây
- ngày
Các kiểu số trong SQL
Trong SQL, các kiểu số được chia thành ba nhóm:
- các kiểu số nguyên
- Số điểm cố định (số vị trí thập phân cố định)
- số dấu phẩy động
Hãy bắt đầu với số nguyên . Chỉ có 5 trong số chúng và chúng có thể được mô tả trong một bảng:
# | Tên loại | Độ dài tính bằng byte | Tương tự từ Java | Giá trị tối thiểu | Gia trị lơn nhât |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | NHỎ | 2 | ngắn | -32.768 | 32.767 |
3 | TRUNG BÌNH | 3 | -8,388,608 | 8.388.607 | |
4 | INT | 4 | int | -2.147.483.648 | 2.147.483.647 |
5 | LỚN | số 8 | dài | -2 63 | 2 63-1 |
Các kiểu dữ liệu rất giống với các kiểu dữ liệu Java, nhưng cũng có một kiểu số nguyên dài ba byte. Điều này được thực hiện để tiết kiệm kích thước.
Tiếp theo là các loại dấu phẩy động , giống như trong Java, chỉ có hai trong số chúng:
# | Tên loại | Độ dài tính bằng byte | Tương tự từ Java | Giá trị tối thiểu | Gia trị lơn nhât |
---|---|---|---|---|---|
1 | TRÔI NỔI | 4 | trôi nổi | -3,40E+38 | +1.18E+38 |
2 | GẤP ĐÔI | số 8 | gấp đôi | -1,79E+308 | +1.79E+308 |
Một lần nữa, không có gì mới. Mọi thứ đều giống như trong Java. Tuy nhiên, khác với Java, SQL có một kiểu đặc biệt khác, đó là số thực fixed-point. Nó được gọi là DECIMAL.
Thông thường loại này được sử dụng để lưu trữ số lượng tiền. Khi tên của loại này được viết, thì sau nó thường cho biết số có bao nhiêu chữ số thập phân trước và sau dấu thập phân. Định dạng chung trông như thế này:
DECIMAL(total_characters, after_comma)
Và một ví dụ nhỏ:
salary DECIMAL(5,2)
Đây là cách chúng tôi mô tả thực tế là cột lương có thể chứa số nguyên (tối đa 3 chữ số thập phân) và phần phân số - 2 chữ số thập phân.
Số ký tự tối đa mà loại DECIMAL hỗ trợ là 65.
Các kiểu chuỗi trong SQL
Các hàng trong cơ sở dữ liệu có thể được lưu trữ dưới hai hình thức:
- Chuỗi chiều dài cố định
- Chuỗi có độ dài thay đổi
Các chuỗi có độ dài cố định được chỉ định là CHAR :
CHAR(length)
Độ dài cố định có nghĩa là tất cả các giá trị của cột này sẽ chứa một số lượng ký tự cố định nghiêm ngặt.
Một ví dụ về chuỗi có độ dài cố định:
country_code CHAR(2)
Các chuỗi có độ dài thay đổi được chỉ định bởi loại VARCHAR :
VARCHAR(max_length)
Độ dài thay đổi có nghĩa là tất cả các giá trị của cột này sẽ chứa văn bản có độ dài bất kỳ, nhưng không quá độ dài tối đa.
Ví dụ chuỗi có độ dài thay đổi:
phone VARCHAR(12)
Chuỗi chiều dài cố định có một lợi thế rất lớn. Nếu khách hàng yêu cầu máy chủ SQL trả lại cho anh ta hàng thứ 1.000.000 từ bảng và các hàng trong bảng có độ dài cố định, thì khi biết độ dài của hàng, bạn có thể dễ dàng tính toán các byte liên quan đến mong muốn hàng ngang.
Trong trường hợp độ dài dòng thay đổi, sẽ không thể nhanh chóng tìm thấy hàng mong muốn trong bảng. Hãy nhớ tốc độ truy cập vào ArrayList và LinkedList, ở đây tình hình cũng xấp xỉ như vậy.
Hãy so sánh cách các chuỗi có độ dài khác nhau sẽ được lưu trữ trong một bảng, tùy thuộc vào loại dữ liệu.
Đường kẻ | CHAR(4) | Byte để lưu trữ | VARCHAR(4) | Byte để lưu trữ | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'A B C D' | 'A B C D' | 4 | 'A B C D' | 5 | |
'abcdefgh' | 'A B C D' | 4 | 'A B C D' | 5 |
Ghi chú. Loại VARCHAR yêu cầu thêm một byte cho cùng độ dài, vì nó phải lưu trữ thêm độ dài của chuỗi.
Các kiểu tạm thời trong SQL
SQL cũng có các kiểu đặc biệt để lưu trữ ngày tháng và thời gian. Tổng cộng có năm loại:
# | Tên loại | Tương tự từ Java DateTime API | Ví dụ | Giá trị tối thiểu | Gia trị lơn nhât |
---|---|---|---|---|---|
1 | NGÀY | Ngày địa phương | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | THỜI GIAN | Giờ địa phương | 'hh:mm:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | NGÀY GIỜ | Địa phươngDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | DẤU THỜI GIAN | Ngày | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | NĂM | 1901 | 2155 |
Tất cả dữ liệu trong truy vấn được viết dưới dạng chuỗi - trong dấu nháy đơn. Định dạng mục từ lớn nhất đến nhỏ nhất:
- Năm
- Tháng
- Ngày
- Giờ
- Phút
- Thứ hai
- Phân số của một giây
Các kiểu DATE, TIME và DATETIME có thể được coi là tương tự theo quy ước của các kiểu từ Java DateTme API: LocalDate, LocalTime, LocalDateTime. Logic là như nhau.
Loại DẤU THỜI GIAN lưu trữ dữ liệu tính bằng mili giây kể từ đầu năm 1970 (một tiêu chuẩn của hệ điều hành UNIX). Ở dạng này, chúng được lưu trữ theo kiểu Ngày trong ngôn ngữ Java.
Và cuối cùng, có loại NĂM, dài 1 byte và lưu trữ các giá trị từ 1 đến 255. Do đó, phạm vi năm có sẵn cho nó là 1901-2155. Loại này không thể lưu trữ năm 1900 vì giá trị 0 được sử dụng để mã hóa giá trị NULL.
Lưu trữ các đối tượng trong SQL
Có những loại đặc biệt để lưu trữ các đối tượng hoặc văn bản có độ dài lớn. Chúng tôi sẽ không đi vào chi tiết về chúng, nhưng dù sao thì tôi cũng sẽ liệt kê chúng:
# | Tên loại | Giải trình |
---|---|---|
1 | CHỮ | Dùng để lưu trữ văn bản dài. Khi so sánh và sắp xếp trên trường này, chỉ 100 ký tự đầu tiên được sử dụng. |
2 | BÃI | Tên này là viết tắt của Byte Large Object. Được lưu trữ dưới dạng tập hợp các byte. Ví dụ, có thể được sử dụng để lưu trữ ảnh trong cơ sở dữ liệu. |
3 | CLOB | Tên này là viết tắt của Char Large Object. Dùng để lưu trữ văn bản dài. |
4 | ENUM | Cho phép bạn đặt một bộ giá trị cố định và lưu trữ một trong số chúng dưới dạng giá trị. |
5 | BỘ | Cho phép bạn đặt một tập hợp giá trị cố định và lưu trữ bất kỳ tập hợp con nào của chúng dưới dạng giá trị. Thường lưu trữ chúng dưới dạng mặt nạ nhị phân. |
Về mặt lý thuyết, bạn có thể tuần tự hóa bất kỳ đối tượng Java nào dưới dạng một tập hợp các byte và lưu trữ nó trong cơ sở dữ liệu dưới dạng BLOB. Lưu đối tượng không phải là một vấn đề. Làm thế nào để làm việc với anh ta hơn nữa?
Giả sử một bảng lưu trữ một triệu đối tượng ở dạng tuần tự hóa - bạn sẽ tìm kiếm chúng như thế nào? Một hệ quản trị cơ sở dữ liệu chỉ hỗ trợ một loại dữ liệu nhất định khi nó cung cấp một tập hợp đầy đủ các chức năng để làm việc với nó.