【问题标题】:ISSUE: Mysql converting Enum to IntISSUE: Mysql 将 Enum 转换为 Int
【发布时间】:2011-07-23 22:12:07
【问题描述】:

我的数据库中有一个非常简单的评分系统,其中每个评分都存储为一个枚举('1','-1')。要计算我尝试使用此语句的总数:

SELECT SUM(CONVERT(rating, SIGNED)) as value from table WHERE _id = 1

这对正数 1 很好,但由于某种原因,-1 被解析为 2。

任何人都可以帮助或提供煽动吗?

或者我应该放弃并将列更改为 SIGNED INT(1)?

【问题讨论】:

    标签: mysql enums int


    【解决方案1】:

    这就是你想要的

    select enum+0 as enum
    

    【讨论】:

      【解决方案2】:

      这种在 MySQL 中为enum 转换为int 的方法是唯一可能的:

      CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1
      

      【讨论】:

        【解决方案3】:

        是的,我建议更改列的类型。当您阅读doc about enum type(强烈建议不要将数字用作枚举值!)时,问题就会变得清晰 - 返回的是枚举项的索引,而不是枚举值本身。

        【讨论】:

        • 嗯,将枚举值更改为 updown 会更具描述性!
        • 也许,但如果他需要做很多这种“评级算法”,它很快就会变得乏味(而且速度很慢)……用“纯整数值”操作要简单得多。跨度>
        • 是的,我在发布此问题后继续进行更改。谢谢你的解释。很有帮助
        【解决方案4】:

        好吧,伙计们,

        刚刚玩了一段时间。我了解到我不应该使用整数作为值的 ENUM。但是我们有多年的数据,我无法更改数据库。

        这个坏男孩起作用了(把它变成一个字符,然后变成一个有符号整数)。

        CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1
        

        【讨论】:

          【解决方案5】:

          使用

          SELECT SUM( IF( columnname >0, CAST( columnname AS CHAR ) , NULL ) ) AS vals
          FROM `tableName` 
          

          【讨论】:

          【解决方案6】:

          我也不会在这里使用枚举,但在这种情况下仍然可以得到需要的东西

          创建表:

          CREATE TABLE test (
              _id INT PRIMARY KEY,
              rating ENUM('1', '-1')
          );
          

          填表:

          INSERT INTO test VALUES(1, "1"), (2, "1"), (3, "-1"), (4, "-1"), (5, "-1");
          

          对枚举执行数学运算会将它们转换为索引,因此可以仅缩放结果值:

          SELECT 
              SUM(3 - rating * 2)
          FROM
              test;
          

          结果:-1 对于测试用例来说是正确的。

          【讨论】:

            猜你喜欢
            • 2018-12-13
            • 2017-08-25
            • 1970-01-01
            • 1970-01-01
            • 2014-07-20
            • 1970-01-01
            • 2020-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多