所谓数字类型大致分为以下几种:
每种类型都有不同的範围及其最大最小值。
可以针对不同整数类型插入值,而每个类型都有其範围,超过範围即无法插入。
创建整数类型
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 |