I just got through fixing a messy problem where a database had a table defined with a couple columns that were ENUM’s with integer values. This leads to extreme amounts of confusion, because there is a lot of ambiguity when doing queries whether the integer is supposed to be treated as the enumerated value, or as the key.
Imagine a table with a column defined as ENUM(‘0’, ‘1’, ‘2’, ‘3’). When doing queries, if you try to do anything with that column, it is unclear whether you mean to use the actual value you pass in, or the position. For example, if I as to say ‘WHERE confusing_column = 2’, it could be interpreted as either meaning the value ‘2’, or the item in the second position (ie; ‘1’). It is even hard to explain because it is so confusing.
The MySQL Documentation does a decent job of explaining it. I agree with their recommendation:
For these reasons, it is not advisable to define an ENUM column with enumeration values that look like numbers, because this can easily become confusing.
I ended up converting everything to Tinyint’s. It takes a few more bits per row, but worth it in my opinion to avoid the confusion.