2012-03-15 18 views
5

Ho una colonna MySQL specificata come:Come recuperare un valore int anziché un valore booleano da una colonna TINYINT (1)?

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

L'intento della colonna è quello di memorizzare un valore intero non superiore a 127 poiché non essendo previsti per essere più di pochissimi oggetto "tipi".

Ho memorizzato '2' nel campo per una delle mie righe.

Utilizzando SqlYog, un semplice SELECT type FROM table produce il risultato corretto, 2.

Tuttavia, utilizzando il Connector/Net 6.1.2 (certamente è un po 'fuori moda, come la versione corrente è 6.5.4), si verifica quanto segue:

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

questo tipo di colonna è solito utilizzato per valori booleani, ma in questo caso voglio ottenere il valore intero. Quanto segue non riesce a produrre il risultato atteso:

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

Qual è il modo corretto per ottenere valori int da un TINYINT (1) colonna utilizzando Connector/Net in un'applicazione .NET?

Questo stia utilizzando la versione di MySQL 5.5.16

+0

Hai ragione; 'TINYINT' viene in genere utilizzato per i booleani. Vorrei suggerire di usare solo un normale campo di tipo 'INTEGER', lo spazio di archiviazione non può essere * quello * costoso. ;) –

+0

Hai provato 'SELECT CAST (tipo AS SIGNED) come tipo FROM table'? –

+1

Lo spazio di archiviazione non è un problema; ma la mia preoccupazione era più per velocità/prestazioni. Se so che un valore particolare non supererà mai un limite, cerco di dimensionare la colonna in modo appropriato. (Che è il motivo per cui non tutte le mie colonne int sono 'BIGINT'. :)) Forse dovrei semplicemente usare' SMALLINT' e chiamarlo un giorno, ma volevo scoprire più background tecnico su questo caso. – JYelton

risposta

3

La risposta per la confusione del connettore può essere tale da parte MySQL docs; Numeric Types:

partire da MySQL 5.0.3, un tipo di dati BIT è disponibile per la memorizzazione di valori di bit di campo. (Prima 5.0.3, MySQL interpreta BIT come TINYINT(1).) ...

o (anche più probabile) questa parte da Numeric Type Overview:

BOOL, BOOLEAN

Questi tipi sono sinonimi di TINYINT(1). Un valore pari a zero è considerato falso. valori diversi da zero sono considerati veri ...

+0

Penso che questo risponda abbastanza saldamente al "perché" della domanda. Spiega perché i risultati del Connector sono diversi da quelli di Sqlyog. Mi sembra anche di usare TINYINT (2) (o una maggiore 'larghezza di visualizzazione') come soluzione alternativa. – JYelton

3

Una soluzione che ho trovato è quello di cambiare semplicemente il tipo di colonna per UNSIGNED:

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

Questo ha il seguente effetto:

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

Che recupera il risultato corretto (2) dopo aver chiamato .GetInt32().

Tuttavia se per qualche motivo si desidera memorizzare valori da -127 a 127 (utilizzandolo come TINYINT firmato) questa soluzione non funziona.


Un'altra soluzione è quella di modificare il tipo di colonna per TINYINT (2):

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

Questo dà:

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

ottiene anche il risultato corretto (2).

Tuttavia ciò mette in discussione lo scopo del numero dopo TINYINT (ad esempio TINYINT(#)). Non è per "optionally specifying the display width"? Forse qualcuno può gettare più luce su questo punto.

4

Metti che nella stringa di connessione da utilizzare come tinyint numero

TreatTinyAsBoolean = false

+0

La documentazione ufficiale di questo può essere trovata su http://dev.mysql.com/doc/refman/5.5/en/connector-net-connection-options.html Grazie per il suggerimento. – JYelton

Problemi correlati