Under the hood, enums are integers -- not strings. The compiler automatically picks the smallest possible integer value given the number of options, so that will almost always work out to less space, especially if your values are long.

Within your smart contract, Solidity will automatically handle converting names to ints for you. If you declare an enum like:

enum Colors {Red, Orange, Yellow, Green, Blue, Purple}

then elsewhere in the contract you could refer to Colors.Red and not have to worry about it actually being a 0 in memory. You could have 256 options in an enum and it'll still be stored as a uint8 , whereas creating a string for each of those would allocate a dynamic byte array which is 32-bytes minimum. Punchline: use enums inside of your smart contracts.

If you're writing a front-end app which talks to the contract using web3, just create a mapping object in JS. Something like: