ISSUE: Mysql converting Enum to Int

前端 未结 6 690
醉话见心
醉话见心 2021-01-11 18:25

I have a very simple rating system in my database where each rating is stored as an enum(\'1\',\'-1\'). To calculate the total I tried using this statement:



        
相关标签:
6条回答
  • 2021-01-11 18:56

    I wouldn't use enum here too, but it is still possible in this case to get what is needed

    Creating table:

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

    Filling table:

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

    Performing math operations on enums converts them to indexes, so it is possible just to scale the result value:

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

    Result: -1 which is true for the test case.

    0 讨论(0)
  • 2021-01-11 19:00

    this is what you want

    select enum+0 as enum
    
    0 讨论(0)
  • 2021-01-11 19:01

    use

    SELECT SUM( IF( columnname >0, CAST( columnname AS CHAR ) , NULL ) ) AS vals
    FROM `tableName` 
    
    0 讨论(0)
  • 2021-01-11 19:09

    Yes, I'd suggest to change the type of the column. The issue becomes clear when you read the doc about enum type (which strongly recommends not to use numbers as enumeration values!) - the index of the enum item is returned, not the enum value itself.

    0 讨论(0)
  • 2021-01-11 19:13

    Ok guys,

    Just had a bit of a mere of a time with this one. I learned that i shouldn't use ENUMs where integers are the values. However We had years worth of data and i couldn't alter the database.

    This bad boy worked (turning it into a character, then into a signed int).

    CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1
    
    0 讨论(0)
  • 2021-01-11 19:14

    This conversion to int in MySQL for enum is only possible:

    CAST(CAST(`rating` AS CHAR) AS SIGNED) as value from table WHERE _id = 1
    
    0 讨论(0)
提交回复
热议问题