2012-03-15 11 views
5

I kolumna MySQL określony jako:Jak pobrać wartość int, a nie boolean z kolumny TINYINT (1)?

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

Intencją kolumny jest przechowywać liczbę całkowitą nie przekracza 127, ponieważ nie przewiduje się więcej niż niewielu obiekt „typu”.

Zapisałem "2" w polu dla jednego z moich wierszy.

Korzystanie SqlYog, prosty SELECT type FROM table daje prawidłowe wyniki, 2.

Jednak użycie Connector/NET 6.1.2 (co prawda jest nieco nieaktualny, ponieważ obecna wersja to 6.5.4), dodaje się dzieje:

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

Ten typ kolumny jest zwykle stosowane dla wartości logicznych, ale w tym przypadku chcę, aby uzyskać wartość całkowitą. Poniższa nie dać oczekiwany rezultat:

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

Jaki jest właściwy sposób, aby uzyskać int wartości z TINYINT (1) kolumna z wykorzystaniem Connector/NET w aplikacji .NET?

to przy użyciu wersji MySQL 5.5.16

+0

Masz rację; 'TINYINT' jest zwykle używany dla wartości logicznych. Sugerowałbym użycie zwykłego pola typu 'INTEGER', przestrzeń dyskowa nie może być * taka * droga. ;) –

+0

Czy próbowałeś 'SELECT CAST (type AS SIGNED) AS type FROM table'? –

+1

Przechowywanie nie stanowi problemu; ale moja troska dotyczyła raczej szybkości/wydajności. Jeśli wiem, że konkretna wartość nigdy nie przekroczy limitu, staram się odpowiednio dopasować kolumnę. (Z tego powodu nie wszystkie moje kolumny int to 'BIGINT'. :)) Być może powinienem po prostu użyć' SMALLINT' i nazwać to dziennie, ale chciałem dowiedzieć się więcej technicznego tła w tej sprawie. – JYelton

Odpowiedz

3

Odpowiedź na błąd złącza może być ta część z MySQL docs; Numeric Types:

Począwszy od MySQL 5.0.3, typ danych BIT jest dostępna do przechowywania wartości nieco pola. (Przed 5.0.3, MySQL interpretuje BIT jako TINYINT(1).) ...

lub (bardziej prawdopodobna), ta część z Numeric Type Overview:

BOOL, BOOLEAN

Te rodzaje są synonimami TINYINT(1). Wartość zero jest uważana za fałszywą. wartości niezerowe są uważane za prawdziwe ...

+0

Myślę, że to całkiem solidnie odpowiada na pytanie "dlaczego". Wyjaśnia, dlaczego wyniki łącznika różnią się od wyników Sqlyog. Mówi mi również, żebym używał TINYINT (2) (lub większej "szerokości wyświetlania") jako obejścia tego problemu. – JYelton

3

One Znalazłem rozwiązanie jest po prostu zmienić typ kolumny do UNSIGNED:

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

ten ma następujący efekt:

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

Który pobiera prawidłowy wynik (2) po wywołaniu .GetInt32().

Jeśli jednak z jakiegoś powodu chciałeś przechowywać wartości od -127 do 127 (używając go jako podpisanego TINYINT) to rozwiązanie nie działa.


Innym rozwiązaniem jest, aby zmienić typ kolumny do TINYINT (2)

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

Daje to:

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

otrzymując także prawidłowy wynik (2).

Jednakże kwestionuje to cel numeru po TINYINT (tj. TINYINT(#)). Czy to nie dla "optionally specifying the display width"? Może ktoś może rzucić więcej światła na ten punkt.

4

Put, że w ciągu połączenia do wykorzystania jako tinyint liczby

TreatTinyAsBoolean = false

+0

Oficjalną dokumentację można znaleźć na stronie http://dev.mysql.com/doc/refman/5.5/en/connector-net-connection-options.html Dziękujemy za poradę. – JYelton

Powiązane problemy