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   |

<<:  [鼠年全马] W38 - 使用Vuex管理资料状态(上)

>>:  JS30 Day 25:Event Capture, Propagation, Bubbling and Once学习笔记

Day-9 在Hazard寻求解法是否搞错了什麽

在Hazard寻求解法是否搞错了什麽 tags: IT铁人 Stall 上一次讲到了三种Hazard...

Code Generator 结构

接续上一篇的 annotation processor 实作,我们的 annotation proc...

GCP IAP

GCP IAP 今天再来了解一下什麽事IAP?他的全名即是dentity-Aware Proxy简称...

Day 19 Onchange v.s. readonly

Odoo 的onchange 有些特别要注意的地方, 像是onchange会影响到的栏位都要写入XM...

[铁人赛 Day06] React 中如何拦截网站 Runtime 错误?- Error boundaries

前言 前一篇 Code Spliting 文章中有提到用 Error boundaries 来处理载...