Nhầm lẫn giữa BOOLEAN hoặc TINYINT


92

Tôi đang thiết kế cơ sở dữ liệu cho một trang web mà tôi cần sử dụng kiểu dữ liệu boolean để chỉ lưu trữ 2 trạng thái, đúng hoặc sai. Tôi đang sử dụng MySQL.
Trong khi thiết kế cơ sở dữ liệu bằng phpMyAdmin, tôi thấy rằng tôi có cả kiểu dữ liệu BOOLEAN và kiểu dữ liệu TINYINT.
Tôi đã xem qua các bài báo khác nhau, một số nói rằng TINYINT giống như BOOLEAN, không có sự khác biệt. Một số người nói BOOLEAN được chuyển đổi thành TINYINT trong MySQL.

Câu hỏi của tôi là, nếu cả hai đều giống nhau tại sao lại tồn tại hai? Chỉ nên có một trong số chúng.

Đây là phần tham khảo các bài tôi đã đọc:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Câu trả lời:


137

MySQL không có kiểu dữ liệu boolean nội bộ. Nó sử dụng kiểu dữ liệu số nguyên nhỏ nhất - TINYINT.

BOOLEAN và BOOL tương đương với TINYINT (1), vì chúng là từ đồng nghĩa.

Cố gắng tạo bảng này -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Sau đó chạy SHOW CREATE TABLE, bạn sẽ nhận được kết quả này -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

1
Nhưng câu trả lời của bạn là đúng trong tất cả các khía cạnh khác. Điều dường như gây nhầm lẫn cho OP là sự tồn tại của các từ đồng nghĩa.
ypercubeᵀᴹ

2
Có vẻ như nó được thực hiện để tương thích ngược. Kiểu dữ liệu BOOLEAN có trước MySQL 5 và kiểu BIT không được tối ưu hóa, nó cũng là TINYINT. Từ tài liệu - Các tính năng mới được lập kế hoạch cho 5.1: Tối ưu hóa loại BIT để mất một chút. (BIT bây giờ chiếm một byte; nó được coi là một từ đồng nghĩa với TINYINT.).
Devart

5
Vâng, bạn có thể biết có BIT(1)hay BIT(17)hoặc thậm chíBIT(64)
ypercubeᵀᴹ

3
@Devart - Nơi câu trả lời của bạn có nhiều phiếu bầu nhất và xuất hiện đầu tiên (dù sao trong danh sách của tôi) và đã qua một thời gian, liệu bạn có sẵn sàng thêm vào câu trả lời của mình để bao gồm một số thảo luận về loại BIT trên MySQL 5.1 và một lát sau?
Jonathan

3
@Jonathan Có lẽ đề cập đến nó là có giá trị, tuy nhiên BIT (1) thực sự không sử dụng ít dung lượng hơn TINYINT (1) và không hiển thị như hầu hết mọi người mong đợi khi sử dụng bảng điều khiển mysql tiêu chuẩn. Vì nhược điểm đó và không có lợi ích lưu trữ, chỉ sử dụng TINYINT (1) hoặc BOOLEAN dường như là cách phổ biến nhất trong trải nghiệm của tôi.
Tyler Smith

31

Chỉ cần lưu ý cho các nhà phát triển php (tôi thiếu các điểm stackoverflow cần thiết để đăng bài này dưới dạng nhận xét) ... chuyển đổi tự động (và im lặng) thành TINYINT có nghĩa là php truy xuất giá trị từ cột "BOOLEAN" dưới dạng "0" hoặc "1", không phải (theo tôi) đúng / sai.

Một nhà phát triển đang xem SQL được sử dụng để tạo bảng và thấy một cái gì đó như: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE," có thể mong đợi một cách hợp lý để thấy kết quả đúng / sai khi một hàng chứa cột đó được truy xuất. Thay vào đó (ít nhất là trong phiên bản PHP của tôi), kết quả sẽ là "0" hoặc "1" (vâng, một chuỗi "0" hoặc chuỗi "1", không phải là int 0/1, cảm ơn bạn php).

Nó là một nit, nhưng đủ để khiến các bài kiểm tra đơn vị thất bại.


2
Một lưu ý bổ sung, trình điều khiển mysql của PHP kéo tất cả các kiểu số nguyên dưới dạng chuỗi.
kojow7

24

Các phiên bản MySQL mới nhất có BITkiểu dữ liệu mới, trong đó bạn có thể chỉ định số bit trong trường, chẳng hạn BIT(1)để sử dụng làm Booleankiểu, vì nó có thể là 0hoặc 1.


7

Theo tham chiếu phiên bản MySql 5.1

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================== =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric


1
Tham chiếu của bạn cho biết bộ nhớ được yêu cầu thực sự là "khoảng (M + 7) / 8 byte". tức là, nó làm tròn đến byte đầy đủ tiếp theo. Vì vậy, nó không mất 1 bit.
mpen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.