Sự khác biệt giữa BIT và TINYINT trong MySQL là gì?


106

Bạn sẽ sử dụng cái nào trong những trường hợp nào? Có nhiều sự khác biệt? Tôi thường sử dụng công cụ nào để lưu trữ boolean?

Câu trả lời:


122

TINYINT là một giá trị số nguyên 8 bit, trường BIT có thể lưu trữ giữa 1 bit, BIT (1) và 64 bit, BIT (64). Đối với các giá trị boolean, BIT (1) khá phổ biến.


10
Sự khác biệt giữa TINYINT và BIT (8) là gì?
Pacerier

16
TINYINT có thể có dấu hoặc không dấu và liên quan đến số âm. Bit chỉ lưu trữ các bit mà không cần ký dữ liệu, bạn phải tự giải thích MSB.
xác định

4
Để tránh nhầm lẫn, cần nói thêm rằng TINYINT và BIT (1) không khác nhau về Yêu cầu lưu trữ của chúng và BOOL và BOOLEAN là từ đồng nghĩa với TINYINT (1) Tổng quan về loại số .
Timo Strotmann

59

Từ Tổng quan về các kiểu số ;

BIT [(M)]

Một loại trường bit. M cho biết số bit trên mỗi giá trị, từ 1 đến 64. Giá trị mặc định là 1 nếu M bị bỏ qua.

Kiểu dữ liệu này đã được thêm vào MySQL 5.0.3 cho MyISAM và mở rộng trong 5.0.5 cho MEMORY, InnoDB, BDB và NDBCLUSTER. Trước 5.0.3, BIT là một từ đồng nghĩa với TINYINT (1).

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

Một số nguyên rất nhỏ. Dải ô có dấu là -128 đến 127. Dải ô không dấu là 0 đến 255.

Ngoài ra, hãy xem xét điều này;

BOOL, BOOLEAN

Những loại này là từ đồng nghĩa của TINYINT (1). Giá trị bằng 0 được coi là sai. Các giá trị khác 0 được coi là đúng.


12
Bạn đang nói rằng booleansẽ mất một byte mặc dù nó thực sự chỉ là một bit, vậy BIT (1) tốt hơn sau v5.0.3?
Pacerier

3
Có @Pacerier. Boolean chỉ đơn giản là một bí danh xấu cho một trường số.
Áxel Costas Pena

7
Theo bộ nhớ thực tế, BIT (1) vẫn chiếm tối thiểu một byte. BIT (M) = (M + 7) / 8 byte. (1 + 7) / 8 = 1 byte. Xem Yêu cầu lưu trữ kiểu số .
Drazen Bjelovuk

1
Buồn rằng BOOL/ BOOLEANlà bí danh TINYINT(1)thay vì BIT. Chắc chắn, tất cả chúng đều chiếm trọn một byte, nhưng về mặt ngữ nghĩa BITsẽ thích hợp hơn nhiều.
MestreLion

38

Tất cả các cuộc thảo luận lý thuyết này đều tuyệt vời, nhưng trên thực tế, ít nhất nếu bạn đang sử dụng MySQL và thực sự cho SQLServer, thì tốt nhất bạn nên gắn bó với dữ liệu phi nhị phân cho boolean của mình vì lý do đơn giản là nó dễ làm việc hơn khi bạn đang xuất dữ liệu, truy vấn, v.v. Điều đặc biệt quan trọng nếu bạn đang cố gắng đạt được khả năng tương tác giữa MySQL và SQLServer (tức là bạn đồng bộ hóa dữ liệu giữa hai loại này), bởi vì việc xử lý kiểu dữ liệu BIT khác nhau ở hai loại này. VẬY trong thực tế, bạn sẽ ít phức tạp hơn nhiều nếu bạn gắn bó với kiểu dữ liệu số. Tôi muốn khuyên MySQL gắn bó với BOOL hoặc BOOLEAN được lưu trữ dưới dạng TINYINT (1). Ngay cả cách MySQL Workbench và MySQL Administrator hiển thị kiểu dữ liệu BIT cũng không đẹp (đó là một biểu tượng nhỏ cho dữ liệu nhị phân).


1
Theo ý kiến ​​của tôi, đó không phải là lỗi của tôi, rằng một số giao diện, v.v. giải thích dữ liệu nhị phân chính xác không chính xác. Nếu một quản trị viên (bao gồm cả tôi) phàn nàn về một số ký hiệu (đề cập đến MySQL Wrokbench) thì đây là lỗi của ai đó đã hiểu sai dữ liệu (nhị phân) của tôi thành một ký hiệu không cung cấp thông tin về nội dung. Vì vậy, MySQL / Oracle đã mắc sai lầm và tôi không sẵn sàng thay đổi khái niệm lập trình của mình chỉ vì bất kỳ ai đã mắc lỗi.
Matmarbon

11

BIT chỉ nên cho phép 0 và 1 (và NULL, nếu trường không được xác định là NOT NULL). TINYINT (1) cho phép bất kỳ giá trị nào có thể được lưu trữ trong một byte duy nhất, -128..127 hoặc 0..255 tùy thuộc vào việc nó có chưa dấu hay không (giá trị 1 cho thấy rằng bạn định chỉ sử dụng một chữ số duy nhất, nhưng nó có không ngăn bạn lưu trữ một giá trị lớn hơn).

Đối với các phiên bản cũ hơn 5.0.3, BIT được hiểu là TINYINT (1), vì vậy không có sự khác biệt ở đó.

BIT có ngữ nghĩa "đây là một boolean" và một số ứng dụng sẽ coi TINYINT (1) theo cùng một cách (do cách MySQL sử dụng để xử lý nó), vì vậy các ứng dụng có thể định dạng cột dưới dạng hộp kiểm nếu chúng chọn loại và quyết định một định dạng dựa trên đó.


4

Có thể sai nhưng:

Tinyint là một số nguyên từ 0 đến 255

bit là 1 hoặc 0

Do đó đối với tôi bit là sự lựa chọn cho boolean


Xin lỗi vì nghĩ rằng chúng tôi đã ở trên T_SQL ở đây nên tôi không biết
Allen Hardy

0

Từ kinh nghiệm của tôi, tôi nói với bạn rằng BIT có vấn đề trên các loại hệ điều hành linux (Ubuntu for ex). Tôi đã phát triển db của mình trên windows và sau khi triển khai mọi thứ trên linux, tôi gặp sự cố với các truy vấn chèn hoặc chọn từ các bảng có LOẠI DỮ LIỆU BIT.

Bit không an toàn cho bây giờ. Tôi đã đổi thành tinyint (1) và hoạt động hoàn hảo. Ý tôi là bạn chỉ cần một giá trị để phân biệt nếu nó là 1 hoặc 0 và tinyint (1) là ok cho điều đó

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.