int and char(1) are not the same.
- int stores a 32 signed whole number, 4 bytes
- char(1) stores a single characters, 1 byte (on SQL Server, does not use UTF-8 etc)
So, it makes no sense to convert them as it stands.
Which means your "20% less disk space" is wrong.
Did you SUM reserved pages for a freshly re-indexed table that is at least 1MB?
If you are using int to store boolean (true or false), and you are converting to Y or N in the char(1), then a more efficient solution is to use bit. Which will take even less space. 3 bit columns will use one byte.
SQL Server has very specfic rules about how data is stored, based on datatype and NULLability. This takes into account variable or fixed length data, as well as precision (for decimals).
The issue here was choosing the wide 4 byte int instead of single byte tinyint.
Using tinyint means the data stays as a number, no conversions, and no fancy combine-in-a-single-colun madness. And is the smallest data type possible for this data