[mysql]与"为"关键字的表别名是否会影响数据类型?

标签: MySQL .Net C#
发布时间: 2017/4/8 17:30:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用以下查询︰

select id from foo order by id DESC limit 1

返回最后一次 id 使用。

我有我的应用程序添加加一,如果不是零。它工作正常。但我决定要做这在 sql 中的 C# 代码。但当我这样做︰

 SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1

但我得到 System.InvalidCastException 错误和令我吃惊的是数据类型打印中添加的代码下面是 int64。但它改变了?

以下是 c# 代码︰

public int GetLastID()
        {
            using (MySqlConnection con = Open())
            {
                using (MySqlCommand cmd = new MySqlCommand())
                {
                    cmd.CommandText = "SELECT IF(id = 0, 0, id + 1) as id from foo order by id DESC limit 1";
                    cmd.Connection = con;
                    con.Open();

                    MySqlDataReader data = cmd.ExecuteReader();

                    if (!data.Read())
                        return 0;

                    System.Windows.Forms.MessageBox.Show(data["id"].GetType().ToString()); // output: int64
                    return (int)data["id"];
                }
            }
        }

别怪我不好的 mysql。我不会用得多。如果你知道任何方式更好地做到这一点,请告诉我 !

解决方法 1:

分配给列的别名 ( AS id ) 不会更改该数据类型。

表达式的数据类型是表达式的结果。

在 MySQL,整数加法运算 (如 id + 1 ,其中 id 是整数类型) 结果在 BIGINT

这种行为记录在这里 (现成) 的 MySQL 参考手册︰ https://dev.mysql.com/doc/refman/5.6/en/arithmetic-functions.html

摘录︰


  • 通常的算术运算符都是可用的。结果是根据以下规则确定︰

情况下 -+ ,和 * ,其结果计算与 BIGINT (64 位) 精度如果两个操作数都是整数。


因此,返回的 BIGINT (64 位整数) 的数据类型是预期的行为。

如果您的要求是要返回一个 32 位整数,唯一的解决方法 (据我所知) 是要创建一个用户定义的函数,例如

  DELIMITER $$

  CREATE FUNCTION udf_bigint_to_int(n BIGINT)
  RETURNS INTEGER
  BEGIN
    RETURN n;
  END$$

  DELIMITER ;

这个工程,示范,也作为一个警告,行为,通过在一个值大于可以由一个 32 位整数,我们可以运行以下命令︰

  SELECT udf_bigint_to_int(9876543210+9)

返回一个 32 位整数的最大值︰

  udf_bigint_to_int(9876543210+9)
  -------------------------------
                       2147483647

如果目的是要使最大 id 值从表中,将 1 添加到它,和返回,作为一个 32 位整数之后创建的用户定义的函数,, 您可以使用像这样的查询︰

 SELECT udf_bigint_to_int( MAX(id) + ABS(SIGN( MAX(id) ))) AS id FROM foo
官方微信
官方QQ群
31647020