2012-03-15 35 views
5

Tôi đã một cột MySQL quy định như:Làm cách nào để lấy giá trị int thay vì giá trị boolean từ cột TINYINT (1)?

`type` TINYINT(1) NOT NULL DEFAULT '0' 

Mục đích của cột là để lưu trữ một giá trị số nguyên không quá 127 vì có được không dự kiến ​​sẽ có nhiều hơn một số rất ít đối tượng "các loại."

Tôi đã lưu '2' trong trường cho một trong các hàng của tôi.

Sử dụng SqlYog, một đơn giản SELECT type FROM table mang lại kết quả thích hợp, 2.

Tuy nhiên, bằng cách sử dụng kết nối/Net 6.1.2 (phải thừa nhận đó là một chút trong ngày, như phiên bản hiện tại là 6.5.4), sau đây sẽ xảy ra:

var Temp = Reader["type"].GetType(); // equals "Boolean" 

Đây là loại cột thường được sử dụng cho các giá trị Boolean, nhưng trong trường hợp này tôi muốn có được giá trị số nguyên. Sau đây không đạt được kết quả mong đợi:

int i = Reader.GetInt32("type"); // equals 1 (should be 2) 

Cách thích hợp để lấy giá trị int từ cột TINYINT (1) bằng Trình kết nối/Net trong ứng dụng .NET là gì?

này đang sử dụng phiên bản MySQL 5.5.16

+0

Bạn là đúng; 'TINYINT' thường được sử dụng cho các boolean. Tôi sẽ đề nghị chỉ sử dụng một trường loại 'INTEGER' thông thường, không gian lưu trữ không thể * đắt tiền *. ;) –

+0

Bạn đã thử 'CHỌN CAST (loại AS KÝ) AS loại FROM bảng'? –

+1

Bộ nhớ không phải là vấn đề; nhưng mối quan tâm của tôi là nhiều hơn cho tốc độ/hiệu suất. Nếu tôi biết một giá trị cụ thể sẽ không bao giờ vượt quá giới hạn, tôi cố gắng định kích thước cột một cách thích hợp. (Đó là lý do tại sao không phải tất cả các cột int của tôi là 'BIGINT'. :)) Có lẽ tôi chỉ nên sử dụng' SMALLINT' và gọi nó là một ngày, nhưng tôi muốn tìm hiểu thêm về nền tảng kỹ thuật trong trường hợp này. – JYelton

Trả lời

3

Câu trả lời cho sự nhầm lẫn của kết nối có thể là một phần này từ MySQL docs; Numeric Types:

Tính đến MySQL 5.0.3, một kiểu dữ liệu BIT có sẵn để lưu trữ các giá trị bit lĩnh vực. (Trước 5.0.3, Phiên dịch MySQL BITTINYINT(1).) ...

hoặc (thậm chí có thể xảy ra nhiều hơn) phần này từ Numeric Type Overview:

BOOL, BOOLEAN

Những loại là từ đồng nghĩa cho TINYINT(1). Giá trị bằng không được coi là sai. giá trị khác không được coi là sự thật ...

+0

Tôi nghĩ câu trả lời này khá chắc chắn về "lý do" của câu hỏi. Nó giải thích tại sao kết quả của Connector khác với Sqlyog. Nó cũng khá nhiều nói với tôi để sử dụng TINYINT (2) (hoặc lớn hơn 'hiển thị chiều rộng') như workaround. – JYelton

3

Một giải pháp tôi đã tìm thấy được chỉ đơn giản là thay đổi kiểu cột để UNSIGNED:

`type` tinyint(1) unsigned NOT NULL DEFAULT '0' 

này có hiệu lực thi hành sau:

var Temp = Reader["type"].GetType(); // equals "Byte" 

Việc nào lấy kết quả phù hợp (2) khi gọi .GetInt32().

Tuy nhiên, vì một số lý do bạn muốn lưu trữ các giá trị từ -127 đến 127 (sử dụng nó như là một TINYINT đã ký), giải pháp này không hoạt động.


giải pháp khác là thay đổi kiểu cột để TINYINT (2):

`type` tinyint(2) NOT NULL DEFAULT '0' 

Điều này cho phép:

var Temp = Reader["type"].GetType(); // equals "SByte" 

Ngoài ra năng suất kết quả thích hợp (2).

Tuy nhiên điều này đưa vào câu hỏi mục đích của số sau TINYINT (tức là TINYINT(#)). Không phải là nó cho "optionally specifying the display width"? Có lẽ ai đó có thể làm sáng tỏ thêm về điểm này.

4

Đặt rằng trong chuỗi kết nối của bạn để sử dụng tinyint như số

TreatTinyAsBoolean = false

+0

Tài liệu chính thức về điều này có thể được tìm thấy tại http://dev.mysql.com/doc/refman/5.5/en/connector-net-connection-options.html Cảm ơn bạn đã có mẹo. – JYelton

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