We have found one legacy problem in our database. In one small table used as list of values primary key column ID was designed as TINYINT(4).

Generally there is no difference between TINYINT(2) or (3) or (4) – this data type take only 1 byte. INT-like data types are by default created as SIGNED unless you explicitly specify UNSIGNED (https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html).

But TINYINT SIGNED means range from -128 to 127. If it would be marked as SIGNED boundaries would be 0 to 255.

We decided to change it to INT data type but we found another problem – foreign key. MySQL requires for foreign key exactly the same data types on both columns and if column is of string type then even the same character set.

So to change column ID from TINYINT to INT we needed to remove foreing key(s), alter all related columns to the new types and re-create foreing key(s) again. See in other text.