【问题标题】:How to retrieve an int value rather than a boolean from a TINYINT(1) column?如何从 TINYINT(1) 列中检索 int 值而不是布尔值?
【发布时间】: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() 会发生什么?

标签: .net mysql


【解决方案1】:

把它放在你的连接字符串中以使用 tinyint 作为数字

TreatTinyAsBoolean=false

【讨论】:

【解决方案2】:

连接器困惑的答案可能是MySQL docs; Numeric Types的这一部分:

从 MySQL 5.0.3 开始,BIT 数据类型可用于存储位字段值。 (在 5.0.3 之前,MySQL 将 BIT 解释为 TINYINT(1)。)...

或者(更有可能)这部分来自Numeric Type Overview

BOOL, BOOLEAN

这些类型是 TINYINT(1) 的同义词。零值被认为是错误的。非零值被认为是真的......

【讨论】:

  • 我认为这很好地回答了问题的“为什么”。它解释了为什么连接器的结果与 Sqlyog 的不同。它也几乎告诉我使用 TINYINT(2)(或更大的“显示宽度”)作为解决方法。
【解决方案3】:

我发现的一个解决方案是将列类型简单地更改为UNSIGNED

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

这有以下效果:

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

在调用 .GetInt32() 时会检索正确的结果 (2)。

但是,如果出于某种原因您想要存储从 -127 到 127 的值(将其用作签名的 TINYINT),则此解决方案不起作用。


另一种解决方案是将列类型更改为 TINYINT(2):

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

这给出了:

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

也产生了正确的结果 (2)。

然而,这对 TINYINT 之后的数字的用途产生了疑问(即TINYINT(#))。不是"optionally specifying the display width"吗?也许有人可以更清楚地说明这一点。

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2012-01-30
    • 2011-11-25
    • 1970-01-01
    • 2011-04-14
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多