2010-09-20 49 views
80

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 boolean nhưng đồng nghiệp của tôi sử dụng tinyint(1).Boolean vs tinyint (1) cho các giá trị boolean trong MySQL

+0

Dường như MySQL xử lý một cách minh bạch 'boolean' là' tinyint (1) '. Vì vậy, bạn có thể sử dụng 'boolean',' true' và 'false' và MySQL xử lý chúng là' tinyint (1) ',' 1' và '0'. – ADTC

+0

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

Trả lời

99

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

+15

Yep - http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html –

+0

Tôi sẽ không nói dữ liệu _types_ là từ đồng nghĩa - tinyint (1) giống như bool , nhưng tinyint và bool thì không giống nhau.Điểm nhỏ, nhưng câu trả lời của bạn đã cho tôi biết lần đầu tiên tôi đọc nó –

+0

Điều này không trả lời được câu hỏi. Trong khi đúng là tinyint (1) có chức năng giống hệt 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ữ một giá trị boolean. –

27

boolean khô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. See this page in the MySQL manual.

Cá nhân tôi sẽ đề nghị sử dụng tinyint làm sở thích, vì boolean không làm những gì bạn nghĩ nó làm từ tên, do đó, nó làm cho mã có khả năng gây hiểu nhầm. Nhưng ở một mức độ thực tế, nó thực sự không quan trọng - cả hai đều làm điều tương tự, vì vậy bạn không đạt được hoặc mất bất cứ điều gì bằng cách sử dụng một trong hai.

6

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

tôi sẽ không khuyên bạn nên enum hoặc tinyint (1) như bit (1) chỉ cần 1 bit để lưu trữ giá trị boolean trong khi tinyint (1) cần 8 bit.

ref

TINYINT vs ENUM(0, 1) for boolean values in MySQL

+0

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

+6

Nếu bạn đang sử dụng InnoDB, bit kết thúc bằng cách sử dụng nhiều không gian như tinyint. Từ [Hiệu suất cao MySQL] (http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/1449314287/) (các chàng trai percona) "InnoDB lưu trữ [s] mỗi cột [bit] là loại số nguyên nhỏ nhất đủ lớn để chứa các bit, vì vậy bạn không lưu bất kỳ dung lượng 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, sử dụng tinyint giống như bit trong InnoDB, và thích hợp hơn vì tinyint thường dễ làm việc hơn. – billmalarky

60

tôi sẽ tham gia một cách tiếp cận khác nhau ở đây và cho rằng nó chỉ là quan trọng đối với các nhà phát triển đồng bào của bạn để hiểu mã của bạn vì nó là dành cho 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ế về ngữ nghĩa truyền đạt ý định của bạn là gì, và điều đó đáng giá.

Nếu bạn sử dụng một tinyint, nó không rõ ràng rằng các giá trị duy nhất bạn sẽ thấy là 0 và 1. Một boolean là luôn luôn đúng hoặc sai.

0

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

Sau đó, Dapper bắt đầu ném ngoại lệ. Tôi đã cố gắng nhìn vào sự khác biệt trước và sau kịch bản. Và nhận thấy 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; 

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

1

Trong khi đó là sự thật mà booltinyint(1)chức năng giống hệt nhau, bool nê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 bool thành kiểu boolean gốc của ngôn ngữ lập trình của bạn.

Các vấn đề liên quan