所謂數字類型大致分為以下幾種:
每種類型都有不同的範圍及其最大最小值。
可以針對不同整數類型插入值,而每個類型都有其範圍,超過範圍即無法插入。
創建整數類型
CREATE TABLE number(
a TINYINT,
b SMALLINT,
c MEDIUMINT,
d INT,
e BIGINT);
mysql> INSERT INTO
-> number(a)
-> VALUES(127);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO
-> number(a)
-> VALUES(128);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
改VALUES(-128)後。
mysql> SELECT * FROM number;
+------+------+------+------+------+
| a | b | c | d | e |
+------+------+------+------+------+
| 127 | NULL | NULL | NULL | NULL |
| -128 | NULL | NULL | NULL | NULL |
+------+------+------+------+------+
再來是精確值(Fixed point types)主要為DECIMAL的類型,在儲存錢相關數值
,建議使用他。
其分為兩個參數,第一個參數為總位數(包括小數點)
,第二個為小數保留幾位
DECIMAL( 4 , 2 )
mysql> CREATE table number2(
-> salary DECIMAL
-> (5,2));
Query OK, 0 rows affected (0.12 sec)
此時插入數值。
mysql> INSERT INTO
-> number2(salary)
-> values(57);
Query OK, 1 row affected (0.01 sec)
發現已經呈現小數後兩位。
mysql> SELECT * FROM number2;
+--------+
| salary |
+--------+
| 57.00 |
+--------+
1 row in set (0.00 sec)
當看到 ..., 1 row affected, 1 warning (0.01 sec)
有warning之訊息,要緊接著輸入SHOW WARNINGS,否則無法顯示warning訊息
。
mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Note | 1265 | Data truncated for column 'salary' at row 1 |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)
當我們插入超過總位數的數值時,系統會回報警告。
mysql> INSERT INTO
-> number2(salary)
-> values(88.5151);
Query OK, 1 row affected, 1 warning (0.01 sec)
利用 SHOW WARNINGS顯示其訊息,結果的部分,系統會將多餘的小數位四捨五入
。
mysql> SHOW WARNINGS;
+------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Note | 1265 | Data truncated for column 'salary' at row 1 |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)
+---------+
| salary |
+---------+
| 57.00 |
| 8.20 |
| 42.52 |
| 88.52 | (原本為88.5151)
浮點數類型(Floating point type)分為 FLOAT(單精度)、DOUBLE(雙精度)兩種類型。
CREATE TABLE number3(
a FLOAT,
b DOUBLE);
如果在創建float、double時,沒有加入參數,在插入較大之值時會有誤差,
故與DECIMAL一樣要插入參數。
mysql> CREATE TABLE number5
-> (a float(8,3),
-> b double(7,4));
Query OK, 0 rows affected (0.32 sec)
mysql> INSERT INTO
-> number5(a,b)
-> values(123.151,155.122);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM number5;
+---------+----------+
| a | b |
+---------+----------+
| 123.151 | 155.1220 |
+---------+----------+
1 row in set (0.00 sec)
此處會詳細說明為何Float類型數值會有誤差。https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
所謂Bit value type顧名思義為二進制(BIT)類型。
mysql> CREATE TABLE number6(a BIT);
Query OK, 0 rows affected (0.07 sec)
在插入值時,由於是1Bit,故無法插入0、1之外的數值,除非在建立時做修改增加長度。
mysql> INSERT INTO number6(a) values(0);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO number6(a) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO number6(a) values(2);
ERROR 1406 (22001): Data too long for column 'a' at row 1
而在顯示值時,會為空,因為我們顯示的是十進制。
mysql> SELECT * FROM number6;
+------+
| a |
+------+
| |
| |
+------+
2 rows in set (0.00 sec)
將改成二進制(+0變成十進制)後,即可正常顯示。
mysql> SELECT (a+0) FROM number6;
+-------+
| (a+0) |
+-------+
| 0 |
| 1 |
+-------+
2 rows in set (0.01 sec)
在顯示結果時,可改變其顯示方式,以二進制(BIN)、十六進制(HEX)呈現等。
mysql> SELECT BIN(a), OCT(a),HEX(a) FROM number7;
+--------+--------+--------+
| BIN(a) | OCT(a) | HEX(a) |
+--------+--------+--------+
| 0 | 0 | 0 |
| 10 | 2 | 2 |
| 100 | 4 | 4 |
| 1101 | 15 | D |
+--------+--------+--------+
4 rows in set (0.00 sec)
當然我們也可以在插入時,直接以二進制方式插入值。
mysql> INSERT INTO number7(a) values(B'1101');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT BIN(a) FROM number7;
+--------+
| BIN(a) |
+--------+
| 0 |
| 10 |
| 100 |
| 1101 |