知識點:
float:浮點數,單精度,佔4字節。
測試
root@localhost : test 05:49:32>create table fl(id int,fl float);
Query OK, 0 rows affected (0.05 sec)
root@localhost : test 05:49:40>insert into fl values(1,123456);
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:49:51>insert into fl values(2,123.456);
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:49:57>insert into fl values(3,1234.567);#7位了
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:50:13>insert into fl values(4,1234567);#7位了
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:50:26>select * from fl;
+------+-------------+
| id | fl |
+------+-------------+
| 1 | 123456 |
| 2 | 123.456 |
| 3 | 1234.57 |
| 4 | 1.23457e+06 |
+------+-------------+
4 rows in set (0.00 sec)
從上面看出:默認的float類型都只能存6個數字(包括小數點前後的位數),整數超過6位就被科學計數表示(id=4),小數位超出則需要四捨五入。那指定float(m)的精度呢?
root@localhost : test 05:59:08>create table fl(id int,fl float(20));
Query OK, 0 rows affected (0.04 sec)
root@localhost : test 05:59:28>show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root@localhost : test 05:59:35>insert into fl values(1,123456);
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:59:44>insert into fl values(2,123.456);
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:59:46>insert into fl values(3,1234.567);#7位了
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:59:50>insert into fl values(4,1234567);#7位了
Query OK, 1 row affected (0.00 sec)
root@localhost : test 05:59:53>select * from fl;
+------+-------------+
| id | fl |
+------+-------------+
| 1 | 123456 |
| 2 | 123.456 |
| 3 | 1234.57 |
| 4 | 1.23457e+06 |
+------+-------------+
4 rows in set (0.01 sec)
從上面看出:和默認的float一樣。所以:默認float和float(m)一樣 ,m<=24; 都是默認float類型,都只能存6個數字(包括小數點前後的位數),整數超過6位就被科學計數表示(id=4);小數位超出則需要四捨五入。那指定他的標度float(m,d) 呢?
mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(7,4) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.02 sec)
ERROR:
No query specified
mysql> insert into fl values(1,123456);#整數是3位,超出了
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into fl values(3,123.4567);
Query OK, 1 row affected (0.00 sec)
mysql> insert into fl values(2,123.45678);#小數位超出,四捨五入
Query OK, 1 row affected (0.00 sec)
mysql> insert into fl values(4,12.456789);#小數位超出,四捨五入
Query OK, 1 row affected (0.00 sec)
mysql> select * from fl;
+------+----------+
| id | fl |
+------+----------+
| 1 | 999.9999 |
| 3 | 123.4567 |
| 2 | 123.4568 |
| 4 | 12.4568 |
+------+----------+
4 rows in set (0.00 sec)
從上面看出:float(m,d):小數點後位數爲d,即整數位數爲(m-d),整數位超出則整數爲(m-d)個999,小數點後位數爲(d)個9999,不用科學計算了;若小數位超出,則需要四捨五入。要是float(m,d)遇到m和d一樣呢?
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(4,4) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)
mysql> insert into fl values(1,123456);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into fl values(2,123.45678);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into fl values(3,123.4567);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into fl values(4,12.456789);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 0.9999 |
| 2 | 0.9999 |
| 3 | 0.9999 |
| 4 | 0.9999 |
+------+--------+
4 rows in set (0.00 sec)
從上面看出:float(m,d):若m和d一樣,則先把小數位數先滿足了,再分配整數位數。所以只有小數點位數,而整數位是0。
之前提過的m<=24,要是大於24呢?
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(25) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` double DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
從上面看出:在沒有標度的float中,從float轉換成了double。而有標度的 float(m,d)當中,m>24呢?
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(100,3) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(100,3) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
從上面看出:從float還是float,沒有受到影響。不過設置這麼大,在整數會變的不準;小數的位數還是m-d,位數不足用0填充(zerofill)。如下測試:
mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(100,3) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into fl values(5,777777777777777777777777777.5555);
Query OK, 1 row affected (0.00 sec)
mysql> select * from fl;
+------+---------------------------------+
| id | fl |
+------+---------------------------------+
| 5 | 777777744225350500000000000.000 | #不準了
+------+---------------------------------+
1 row in set (0.00 sec)
mysql> drop table fl;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(25,23) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(25,23) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into fl values(5,99.555555555555555);
Query OK, 1 row affected (0.00 sec)
mysql> select * from fl;
+------+----------------------------+
| id | fl |
+------+----------------------------+
| 5 | 99.55555725097656000000000 | #小數位被0填充
+------+----------------------------+
1 row in set (0.00 sec)
注意:當float(m,d) 設置了標度之後,小數位一定會存在。當整數位沒有被超過,需要用0填充;整數位被超過了,需要用9填充,小數位數不能大於30否則報錯:
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(5,3) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8
-> ;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into fl values(1,123);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 99.999 |
+------+--------+
1 row in set (0.00 sec)
mysql> insert into fl values(2,13);
Query OK, 1 row affected (0.00 sec)
mysql> insert into fl values(3,3);
Query OK, 1 row affected (0.00 sec)
mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 99.999 | #9填充
| 2 | 13.000 | #0填充
| 3 | 3.000 |
+------+--------+
3 rows in set (0.00 sec)
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(102,100) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ERROR 1425 (42000): Too big scale 100 specified for column 'fl'. Maximum is 30. #標度不能大於30,等於30可以建立
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(52,50) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ERROR 1425 (42000): Too big scale 50 specified for column 'fl'. Maximum is 30.
總結:float存在這麼多潛在因素,用的時候需要注意,能避免就避免用。