Số thập phân được lưu trữ bằng định dạng nhị phân, với số nguyên và phân số được lưu trữ riêng. Mỗi bội số chín chữ số yêu cầu 4 byte, theo sau là một số byte cho phần còn lại, như sau
Kiểu dữ liệu chuỗi
Trong phần mô tả bên dưới, M
là độ dài cột được khai báo [tính bằng ký tự hoặc byte], trong khi len
là độ dài thực tính bằng byte của giá trị
Trong một số bộ ký tự, không phải tất cả các ký tự đều sử dụng cùng một số byte. utf8 mã hóa các ký tự với một đến ba byte cho mỗi ký tự, trong khi utf8mb4 yêu cầu một đến bốn byte cho mỗi ký tự
Khi sử dụng trường thuộc tính NÉN, 1 byte được dành riêng cho siêu dữ liệu. Ví dụ: VARCHAR[255] sẽ sử dụng +2 byte thay vì +1
ví dụ
Giả sử một bộ ký tự một byte
Kiểu dữ liệu ngày và giờ
Micro giây
MariaDB 5. 3 và MySQL5. 6 micro giây được giới thiệu. Việc triển khai lưu trữ cơ bản là khác, nhưng từ MariaDB 10. 1, MariaDB mặc định ở định dạng MySQL [bằng biến]. Micro giây có các yêu cầu lưu trữ bổ sung sau đây
mysql 5. 6+ và MariaDB 10. 1+
MariaDB 5. 3 - MariaDB 10. 0
NULL
Đối với các định dạng hàng InnoDB COMPACT, DYNAMIC và COMPRESSED, một số byte sẽ được phân bổ trong tiêu đề bản ghi cho các trường có thể null. Nếu có từ 1 đến 8 trường nullable, 1 byte như vậy sẽ được cấp phát. Trong khu vực tải trọng của bản ghi, sẽ không có khoảng trống nào được dành riêng cho các giá trị NULL
Đối với định dạng hàng REDUNDANT của InnoDB, chi phí chung là 1 bit trong tiêu đề bản ghi [như một phần của con trỏ "cuối trường" 1 byte hoặc 2 byte]. Ở định dạng đó, trường có độ dài cố định NULL sẽ sử dụng cùng một lượng dung lượng như bất kỳ giá trị NOT NULL nào trong khu vực tải trọng của bản ghi. Động lực là có thể cập nhật tại chỗ giữa các giá trị NOT NULL và NULL
Một câu hỏi đơn giản có thể xuất hiện trong đầu khi làm việc với MySQL là "Có nên gán kiểu dữ liệu DATETIME hoặc TIMESTAMP cho một cột vì cả hai dường như lưu trữ cùng một dữ liệu?". Mặc dù chúng lưu trữ cùng một dữ liệu, nhưng chúng khác nhau theo một số cách;
Điểm tương đồng giữa DATETIME và TIMESTAMP
- Cả hai đều lưu trữ dữ liệu theo định dạng "YYYY-MM-DD HH. MM. định dạng SS"
- Cả hai đều bao gồm một ngày cũng như một phần thời gian
- Khởi tạo tự động có thể xảy ra cho cả hai
- Cả hai thay đổi dữ liệu trong khi cập nhật bản ghi với thời gian dữ liệu hiện tại theo ràng buộc
- Cả hai đều có thể có phần giây phân số có độ chính xác lên đến 6 chữ số micro giây
Sự khác biệt giữa DATETIME và TIMESTAMP
- Phạm vi được hỗ trợ cho DATETIME là '1000-01-01 00. 00. 00' đến '9999-12-31 23. 59. 59' trong khi đối với DẤU THỜI GIAN là '1970-01-01 00. 00. 01' UTC đến '2038-01-09 03. 14. 07' UTC
- Trước MySQL 5. 6. 4, DẤU THỜI GIAN cần 4 byte [+3 byte cho giây phân số] để lưu trữ dữ liệu trong khi DATETIME cần 8 byte [+3 byte cho giây phân số]
- Kể từ MySQL 5. 6. 4, DATETIME yêu cầu 5 byte + 3 byte bổ sung để lưu trữ dữ liệu phân số giây
- Trong MySQL5+, giá trị TIMESTAMP chuyển đổi từ thời điểm hiện tại sang UTC và ngược lại trong khi DATETIME không thực hiện bất kỳ chuyển đổi nào
- DẤU THỜI GIAN khác với cài đặt múi giờ hiện tại trong khi DATETIME không đổi
- Dữ liệu DẤU THỜI GIAN có thể được lập chỉ mục trong khi dữ liệu DATETIME không thể
- Các truy vấn có DATETIME sẽ không được lưu vào bộ nhớ đệm nhưng các truy vấn có DẤU THỜI GIAN sẽ được lưu vào bộ nhớ đệm
Múi giờ hệ thống của tôi là IST, vì vậy theo mặc định, MySQL sử dụng múi giờ IST
- mysql>TẠO BẢNG `nhân viên`
- [
- `entry_time` datetime KHÔNG NULL DEFAULT CURRENT_TIMESTAMP BẬT
- CẬP NHẬT CURRENT_TIMESTAMP
- ]
- engine=innodb DEFAULT charset=latin1 mysqlINSERT INTO `employee`
- [
- `thời_gian`
- ]
- GIÁ TRỊ
- [
- DẤU THỜI GIAN HIỆN TẠI
- ];mysql>CHỌN *
- TỪ `nhân viên`;
Bây giờ, hãy thay đổi múi giờ hệ thống từ IST sang EST, tôi. e. , UTC-05. 00 trong những tháng lạnh của Giờ tiết kiệm ánh sáng ban ngày
- mysql> SET @@session. time_zone = '-05. 00';
- mysql> INSERT INTO `employee` [`entry_time`] VALUES [CURRENT_TIMESTAMP];
- mysql> CHỌN * TỪ `nhân viên`;
Kết quả là như nhau mặc dù chúng tôi đã thay đổi múi giờ
- mysql>TẠO BẢNG `nhân viên`
- [
- `entry_time` dấu thời gian KHÔNG NULL DEFAULT CURRENT_TIMESTAMP BẬT
- CẬP NHẬT CURRENT_TIMESTAMP
- ]
- engine=innodb DEFAULT charset=latin1 mysqlINSERT INTO `employee`
- [
- `thời_gian`
- ]
- GIÁ TRỊ
- [
- DẤU THỜI GIAN HIỆN TẠI
- ];mysql>CHỌN *
- TỪ `nhân viên`;
- mysql> SET @@session. time_zone = '-05. 00';
Bây giờ, hãy thay đổi múi giờ hệ thống từ IST sang EST, tôi. e. , UTC-05. 00 trong những tháng lạnh của Giờ tiết kiệm ánh sáng ban ngày
ĐẦU RA
Thời gian nhập cảnh ____________________
Phần kết luận
Kết quả trên có thể thay đổi theo múi giờ đã đặt, tôi. e. , EST tức là -5 giờ kể từ giờ UTC
Mặc dù cả hai kiểu dữ liệu trông giống nhau, nhưng chúng khác nhiều so với những gì chúng ta có thể nghĩ về. Hy vọng thủ thuật nhỏ này sẽ giúp được ai đó phần nào trong việc phân biệt 2 kiểu dữ liệu khó hiểu này. Vui lòng chia sẻ phản hồi của bạn nếu bạn thấy mẹo này hữu ích cho bạn