【发布时间】:2012-03-15 22:14:19
【问题描述】:
我有一个 MySQL 列指定为:
`type` TINYINT(1) NOT NULL DEFAULT '0'
该列的目的是存储一个不超过 127 的整数值,因为预计不会超过极少数的对象“类型”。
我在其中一行的字段中存储了“2”。
使用SqlYog,一个简单的SELECT type FROM table 会产生正确的结果,2。
但是,使用 Connector/Net 6.1.2(诚然它有点过时,因为当前版本是 6.5.4),会发生以下情况:
var Temp = Reader["type"].GetType(); // equals "Boolean"
这种类型的列是 通常用于布尔值,但在这种情况下,我想获取整数值。以下未能产生预期的结果:
int i = Reader.GetInt32("type"); // equals 1 (should be 2)
在 .NET 应用程序中使用 Connector/Net 从 TINYINT(1) 列获取 int 值的正确方法是什么?
这是使用 MySQL 5.5.16 版
【问题讨论】:
-
你是对的;
TINYINT通常用于布尔值。我建议只使用常规的INTEGER类型字段,存储空间不能那么昂贵。 ;) -
你试过
SELECT CAST(type AS SIGNED) AS type FROM table吗? -
存储不是问题;但我更关心的是速度/性能。如果我知道某个特定值永远不会超过限制,我会尝试适当地调整列的大小。 (这就是为什么不是我所有的 int 列都是
BIGINT。:))也许我应该只使用SMALLINT并收工,但我想了解更多关于这个案例的技术背景。 -
@Eugen 我没有 - 我正在设计表,因此可以选择以一种不需要异常查询的方式指定列类型。当我遇到它时,我只是(过度?)对此感到好奇。
-
如果您使用
Reader.GetValue()或Reader.GetSByte()而不是Reader.GetInt32()会发生什么?