iT邦幫忙

0

MySQL 數字類型資料之基本操作

所謂數字類型大致分為以下幾種:

https://ithelp.ithome.com.tw/upload/images/20201111/20126182N9OSk0c0zp.png

每種類型都有不同的範圍及其最大最小值。

可以針對不同整數類型插入值,而每個類型都有其範圍,超過範圍即無法插入。

創建整數類型

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   |

尚未有邦友留言

立即登入留言