Boolean vs tinyint (1) cho các giá trị boolean trong MySQL


124

Loại cột nào là tốt nhất để sử dụng trong cơ sở dữ liệu MySQL cho các giá trị boolean? Tôi sử dụng booleannhưng đồng nghiệp của tôi sử dụng tinyint(1).


3
Có vẻ như MySQL xử lý minh bạch booleannhư tinyint(1). Vì vậy, bạn có thể sử dụng boolean, truefalsevà xử lý MySQL chúng như tinyint(1), 10.
ADTC

Một trường hợp khác là char 1 với Y & N được một số người cho là nhanh hơn.
Zon

Câu trả lời:


153

Các kiểu dữ liệu này là từ đồng nghĩa.


6
Tôi sẽ không nói các kiểu dữ liệu là từ đồng nghĩa - tinyint (1) giống với bool, nhưng tinyint và bool không giống nhau. Điểm nhỏ, nhưng câu trả lời của bạn vấp tôi lên lần đầu tiên tôi đọc nó
Kyle Chadha

2
Điều này không trả lời câu hỏi. Mặc dù đúng là tinyint (1) về mặt chức năng giống với bool, OP đã hỏi điều gì là tốt nhất để sử dụng. Câu trả lời của @dj_segfault thực hiện một công việc thích hợp giải thích tại sao bool nên được ưu tiên hơn tinyint (1) khi lưu trữ giá trị boolean.
Kyle Morgan

87

Tôi sẽ thực hiện một cách tiếp cận khác ở đây và gợi ý rằng điều quan trọng đối với các nhà phát triển đồng nghiệp của bạn là hiểu mã của bạn cũng như đối với trình biên dịch / cơ sở dữ liệu. Sử dụng boolean có thể làm điều tương tự như sử dụng tinyint, tuy nhiên nó có lợi thế là truyền đạt ngữ nghĩa ý định của bạn là gì và điều đó đáng giá.

Nếu bạn sử dụng tinyint, không rõ ràng rằng các giá trị duy nhất bạn sẽ thấy là 0 và 1. Boolean LUÔN LUÔN đúng hay sai.


35

booleankhông phải là một kiểu dữ liệu riêng biệt trong MySQL; nó chỉ là một từ đồng nghĩa với tinyint. Xem trang này trong hướng dẫn sử dụng MySQL .

Cá nhân tôi khuyên bạn nên sử dụng tinyint như một tùy chọn, bởi vì boolean không làm những gì bạn nghĩ nó làm từ tên, vì vậy nó tạo ra mã có khả năng gây hiểu lầm. Nhưng ở cấp độ thực tế, điều đó thực sự không quan trọng - cả hai đều làm điều tương tự, vì vậy bạn sẽ không đạt được hay mất gì khi sử dụng cả hai.


8

sử dụng enum dễ dàng và nhanh nhất

tôi sẽ không đề xuất enum hoặc tinyint (1) vì bit (1) chỉ cần 1 bit để lưu trữ giá trị boolean trong khi tinyint (1) cần 8 bit.

ref

TINYINT so với ENUM (0, 1) cho các giá trị boolean trong MySQL


Chúng tôi không thể sử dụng enum vì cơ sở dữ liệu của chúng tôi cũng cần hỗ trợ sqlite
tom

11
Nếu bạn đang sử dụng InnoDB, bit sẽ chỉ sử dụng nhiều không gian như tinyint. Từ MySQL Hiệu suất cao (những kẻ percona) "InnoDB lưu trữ [s] mỗi cột [bit] dưới dạng kiểu số nguyên nhỏ nhất đủ lớn để chứa các bit, vì vậy bạn không tiết kiệm bất kỳ không gian lưu trữ nào." Lợi ích duy nhất là nếu bạn đang lưu trữ nhiều giá trị boolean trong cột BIT (morethan1). Vì vậy, nếu bạn chỉ có một trường boolean, việc sử dụng tinyint cũng giống như bit trong InnoDB, và sẽ tốt hơn vì tinyint thường dễ làm việc hơn.
billmalarky

Không đúng với MySQL: BIT(M) - approximately (M+7)/8 byteshãy xem: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

Trong khi đó là sự thật mà booltinyint(1)chức năng giống hệt nhau, boolnên là lựa chọn ưa thích vì nó mang ý nghĩa ngữ nghĩa của những gì bạn đang cố gắng làm. Ngoài ra, nhiều ORM sẽ chuyển đổi boolthành kiểu boolean bản địa của ngôn ngữ lập trình của bạn.


0

Kinh nghiệm của tôi khi sử dụng Dapper để kết nối với MySQLnó rất quan trọng . Tôi đã thay đổi một bit không nullable (1) thành tinyint (1) có thể nullable bằng cách sử dụng tập lệnh sau:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Sau đó Dapper bắt đầu ném Exceptions. Tôi đã cố gắng xem xét sự khác biệt trước và sau khi viết kịch bản. Và nhận thấy rằng bit (1) đã thay đổi thành tinyint (1).

Sau đó tôi chạy:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Mà đã giải quyết được vấn đề.

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.