2012-03-15 21 views
5

he especificado una columna MySQL como:¿Cómo recuperar un valor int en lugar de un booleano de una columna TININT (1)?

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

La intención de la columna es almacenar un valor entero que no exceda de 127, ya que no se espera que sean más que un muy pocos objeto "tipos".

He almacenado '2' en el campo para una de mis filas.

Usando SqlYog, un simple SELECT type FROM table produce el resultado correcto, 2.

Sin embargo, utilizando el conector/Net 6.1.2 (la verdad es que es un poco fuera de fecha, ya que la versión actual es la 6.5.4), ocurre lo siguiente:

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

este tipo de columna es usado generalmente para valores booleanos, pero en este caso me quieren obtener el valor entero. A continuación se deja de producir el resultado esperado:

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

Cuál es la forma adecuada para obtener valores enteros desde un TINYINT (1) usando Connector/Net en una aplicación .NET?

Se trata de utilizar la versión 5.5.16 de MySQL

+0

Tiene usted razón; 'TINYINT' se usa generalmente para booleanos. Sugeriría usar solo un campo de tipo 'INTEGER' normal, el espacio de almacenamiento no puede ser * tan * costoso. ;) –

+0

¿Has probado 'SELECT CAST (escribe ASIGNADO) COMO tipo FROM table'? –

+1

El almacenamiento no es un problema; pero mi preocupación era más por la velocidad/el rendimiento. Si sé que un valor en particular nunca excederá un límite, trato de ajustar el tamaño de la columna de manera apropiada. (Por eso no todas mis columnas int son 'BIGINT '. :)) Tal vez debería usar' SMALLINT' y llamarlo un día, pero quería saber más acerca de los antecedentes técnicos de este caso. – JYelton

Respuesta

3

La respuesta para la confusión del conector puede ser esta parte de MySQL docs; Numeric Types:

MySQL 5.0.3, un tipo de datos BIT está disponible para almacenar valores de campo de bits. (Antes de 5.0.3, MySQL interpreta BIT como TINYINT(1).) ...

o (aún más probable) esta parte de Numeric Type Overview:

BOOL, BOOLEAN

Estos tipos son sinónimos de TINYINT(1). Un valor de cero se considera falso. valores distintos de cero se consideran cierto ...

+0

Creo que esto responde bastante bien el "por qué" de la pregunta. Explica por qué los resultados del Conector son diferentes de los de Sqlyog. También me dice que use TINYINT (2) (o un mayor 'ancho de pantalla') como solución alternativa. – JYelton

3

Una solución que he encontrado es simplemente cambiar el tipo de columna a UNSIGNED:

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

Esto tiene el efecto siguiente:

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

Que recupera el resultado correcto (2) al llamar a .GetInt32().

Sin embargo, si por algún motivo desea almacenar valores de -127 a 127 (utilizándolo como TINYINT firmado) esta solución no funciona.


Otra solución es cambiar el tipo de columna a TINYINT (2):

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

Esto da:

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

también produciendo el resultado apropiado (2).

Sin embargo, esto pone en duda el propósito del número después de TINYINT (es decir, TINYINT(#)). ¿No es para "optionally specifying the display width"? Tal vez alguien pueda arrojar más luz sobre este punto.

4

poner esto en la cadena de conexión para utilizar como tinyint número

TreatTinyAsBoolean = false

+0

La documentación oficial de esto se puede encontrar en http://dev.mysql.com/doc/refman/5.5/en/connector-net-connection-options.html Gracias por la sugerencia. – JYelton

Cuestiones relacionadas