2012-06-23 13 views
67

Tôi đã thiết kế cơ sở dữ liệu cho trang web nơi 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 cách sử dụ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 đã đi qua các bài viết khác nhau, một số cho biết TINYINT là giống như BOOLEAN, không có sự khác biệt. Một số người nói rằng BOOLEAN được chuyển đổi thành TINYINT trong MySQL.Sự nhầm lẫn BOOLEAN hoặc TINYINT

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

Đây là tài liệu tham khảo cho bài viết 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

Trả lời

101

MySQL không có nội kiểu dữ liệu boolean. 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 ra bảng này -

CREATE TABLE table1 (
    column1 BOOLEAN DEFAULT NULL 
); 

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

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

Có [BIT] (http: //dev.mysql.com/doc/refman/5.5/en/bit-type.html) –

+0

Vâng, thực sự. Chưa nghĩ về BIT. – Devart

+1

Nhưng câu trả lời của bạn là chính xác trong tất cả các khía cạnh khác. Điều gì 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. –

21

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

7

Tính đến phiên bản MySql 5,1 reference

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 dung lượng cần thiết thực sự là "xấp xỉ (M + 7)/8 byte". tức là, nó làm tròn tới byte đầy đủ tiếp theo. Vì vậy, nó không ** không ** mất 1 bit. – mpen

+0

@mpen tnx, tôi đã cập nhật câu trả lời. – fortune

25

Chỉ cần một 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 này như là một bình luận) ... automagic (và im lặng) chuyển đổi để TINYINT có nghĩa là php lấy av alue từ cột "BOOLEAN" dưới dạng "0" hoặc "1", không phải là dự kiến ​​(theo tôi) đúng/sai.

Nhà phát triển đang xem SQL được sử dụng để tạo bảng và thấy thứ gì đó như: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", hợp lý có thể thấy kết quả đúng/sai khi một hàng chứa cột đó được truy lục. 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" (có, một chuỗi "0" hoặc chuỗi "1", không phải là 0/1 int, cảm ơn bạn php).

Đó là một nit, nhưng đủ để gây ra các bài kiểm tra đơn vị thất bại.

+1

Như một lưu ý bổ sung, các trình điều khiển mysql của PHP lấy tất cả các kiểu số nguyên như các chuỗi. – kojow7