В случае INT(8)
вы должны знать, что 8 - это не ограничение размера. Это частое заблуждение пользователей MySQL. Аргумент для INT-подобных типов данных является лишь подсказкой SQL для дополнения значений, если они имеют меньше цифр, чем аргумент. Обычно используется только для ZEROFILL.
CREATE TABLE foo ( i1 INT(8) ZEROFILL, i2 INT(16) ZEROFILL );
INSERT INTO foo VALUES (1234, 1234);
SELECT * FROM foo;
+----------+------------------+
| i1 | i2 |
+----------+------------------+
| 00001234 | 0000000000001234 |
+----------+------------------+
Значение 8 против 16 не изменяет объем памяти, требуемый INT, и диапазон значений, которые он поддерживает. Тип данных INT всегда 32-битный и всегда допускает значения от -2 31 до 2 31 -1, независимо от того, какой аргумент вы ему задаете.
Аналогично TINYINT всегда 8 бит, SMALLINT всегда 16 бит, MEDIUMINT всегда 24 бит, а BIGINT всегда 64 бит.
Полученное вами значение 10 - это точность чисел, а не ограничение по размеру. То есть 32-битное значение может использовать до 10 цифр при отображении в base-10:
SELECT LENGTH(POW(2,31));
+-------------------+
| LENGTH(POW(2,31)) |
+-------------------+
| 10 |
+-------------------+