MySQL基礎知識02數據類型(二)數值相關類型
1.INT
MySQL支持5中整數類型,每個整數類型又可以分為有符號整數和無符號整數。
類型 |
字節數 |
TINYINT |
1 |
SMALLINT |
2 |
MEDIUMINT |
3 |
INT |
4 |
BIGINT |
8 |
1.1.2. DECIMAL(NUMERIC)
MySQL使用DECIMAL表示定點數,NUMERIC是DECIMAL的一個別名。
DECIMAL(5,2)表示這個定點數類型的整數和小數部分總共5位,其中3位是整數,2位是小數。
DECIMAL的總位數最多65位,超出65則報錯。
mysql> create table n3 ( id numeric(66) primary key);
ERROR 1426 (42000): Too-big precision 66 specified for ‘id‘. Maximum is 65.
創建一個包含62位整數加3位小數的定點數類型的列的數據表。
mysql> create table n2 ( id numeric(65,3) primary key);
Query OK, 0 rows affected (0.02 sec)
mysql> show create table n2;
+-------+----------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------+
| n2 | CREATE TABLE `n2` (
`id` decimal(65,3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在DECIMAL(65,3)類型中,小數部分超出3位時則自動截取為3位小數。
mysql> insert into n2 values (12345678901234567890123456789012345678901234567890123456789012.345);
Query OK, 1 row affected (0.05 sec)
mysql> insert into n2 values (12345678901234567890123456789012345678901234567890123456789012.12345);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert into n2 values (12345678901234567890123456789012345678901234567890123456789012);
Query OK, 1 row affected (0.01 sec)
mysql> select * from n2;
+--------------------------------------------------------------------+
| id |
+--------------------------------------------------------------------+
| 12345678901234567890123456789012345678901234567890123456789012.000 |
| 12345678901234567890123456789012345678901234567890123456789012.123 |
| 12345678901234567890123456789012345678901234567890123456789012.345 |
+--------------------------------------------------------------------+
3 rows in set (0.00 sec)
在DECIMAL(65,3)類型中,整數部分不允許超過62位。
mysql> insert into n2 values (12345678901234567890123456789012345678901234567890123456789012345);
ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
在使用DECIMAL類型時,如果不指定精度,則默認為DECIMAL(10,0)。
mysql> create table n7 ( id decimal primary key);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table n7;
+-------+----------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------+
| n7 | CREATE TABLE `n7` (
`id` decimal(10,0) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
定點數的運算:
mysql> select cast( 123456789012345678901234567890.1234567890 as decimal(40,10) ) + cast(1.1111111111 as decimal(40,10) );
+-------------------------------------------------------------------------------------------------------------+
| cast( 123456789012345678901234567890.1234567890 as decimal(40,10) ) + cast(1.1111111111 as decimal(40,10) ) |
+-------------------------------------------------------------------------------------------------------------+
| 123456789012345678901234567891.2345679001 |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
2.FLOAT/DOUBLE
MySQL提供了浮點數FLOAT和DOUBLE類型,其中FLOAT占用4個字節,DOUBLE占用8個字節。
FLOAT(5,2)表示有3位整數加上2位小數的浮點數。
浮點數的查詢不能簡單的相等比較:
mysql> create table n8 ( id float(10,3) primary key);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table n8;
+-------+--------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------+
| n8 | CREATE TABLE `n8` (
`id` float(10,3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into n8 values ( 1234567.123);
Query OK, 1 row affected (0.01 sec)
mysql> select * from n8;
+-------------+
| id |
+-------------+
| 1234567.125 |
+-------------+
1 row in set (0.00 sec)
mysql> select * from n8 where id=1234567.123;
Empty set (0.00 sec)
mysql> select * from n8 where id=1234567.125;
+-------------+
| id |
+-------------+
| 1234567.125 |
+-------------+
1 row in set (0.00 sec)
mysql> select * from n8 where id=1234567.126;
Empty set (0.00 sec)
上述查詢中,插入的原始數據是1234567.123,而查詢到的實際是1234567.125。
MySQL基礎知識02數據類型(二)數值相關類型