Это работает точно так, как задумано FLOAT(10,7)
. Когда вы даете значение, которое не помещается в число цифр, оно ограничивает значение и использует наибольшее значение, которое может поместиться.
В этом случае десятизначное значение 999,99999999 округляется до 1000,0000000.
https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html говорит:
MySQL допускает нестандартный синтаксис: FLOAT (M, D) или REAL (M, D) или DOUBLE PRECISION (M, D). Здесь (M, D) означает, что значения могут быть сохранены в сумме до M цифр, из которых D цифр может быть после десятичной точки.
Другими словами, вы дали ему ограничение на максимальное значение 1000.0000000, потому что вы сказали, что оно должно быть максимально на 10 цифрах, из которых 7 цифр находятся справа от десятичной точки.
mysql> create table f ( f float(10,7));
mysql> insert into f values (1196.104);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'f' at row 1 |
+---------+------+--------------------------------------------+
mysql> select * from f;
+--------------+
| f |
+--------------+
| 1000.0000000 |
+--------------+
Если вы хотите сохранить большие значения, объявите FLOAT
с достаточным количеством цифр для хранения значений, которые вы используете. Например, значение 1196.104 может быть вставлено в FLOAT(11,7)
или FLOAT(10,6)
.
Или вы можете использовать FLOAT
без аргументов, и это вообще не будет ограничивать количество цифр.
Есть некоторые предостережения относительно FLOAT. Это неточный числовой тип, и он будет иметь ошибки округления. Это неизбежно из-за способа реализации FLOAT, и это влияет на каждый язык программирования.
Чтение https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html и https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Также посмотрите мой старый твит об этом:
https://twitter.com/billkarwin/status/347561901460447232