零基础学习MySQL数据库—1⼀、数据类型
1. 数值类型
越界测试:
说明:
在MySQL中,整型可以指定有符号和⽆符号的,默认是有符号的。
可以通过UNSIGNED来说明某个字段是⽆符号的。
其他数据类型与此⼀致,就不⼀⼀列举了。
关于 UNSIGNED 细节
int的表⽰范围是-2147483648 ~ 2147483647,int unsigned 的范围是0 ~ 4294967295。所以我们在很多时候需要使⽤unsigned 来表⽰⾮负数,⽐如年龄等。然⽽在实际使⽤中,unsigned可能会带来⼀些负⾯的影响,例如:mysql> create table tt1(num tinyint);Query OK, 0 rows affected (0.11 sec)mysql> insert into tt1 values(1);Query OK, 1 row affected (0.02 sec)mysql> insert into tt1 values(128); -- 越界插⼊ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> select * from tt1;+------+| num  |+------+|    1 |+------+1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1516mysql> create table tt2(num tinyint unsigned);Query OK, 0 rows affected (0.06 sec)mysql> insert into tt2 values(-1);  -- ⽆符号,范围是:0~255ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> insert into tt2 values(255);Query OK, 1 row affected (0.01 sec)mysql> select * from tt2;+------+| num  |+------+|  255 |+------+1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
接着,执⾏select a - b from tt3; 这个结果会是怎样的呢?会是-1 吗?我的Windows操作系统中执⾏出来是如下的结果:
怎么会是这样呢? 为了弄清这个问题,我们先看⼀段C代码:
执⾏结果:
结果可以看出,在内存中都是ffffffff,只是ffffffff可以代表两种值:对于⽆符号的整数值,其是整数的最⼤值,即4294967295;对于有符号数来说,第⼀位代表符号位,如果是1,表⽰的是负数,这时应该是取反加1得到的负数值,即-1。
那么,怎么获得-1这个值呢?可以对SQL_ MODE这个参数进⾏设置即可,例如:
尽量不使⽤unsigned,因为可能带来⼀些意想不到的效果。另外,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。
bit 的使⽤
基本语法:bit[(M)] 位字段类型。M表⽰每个值的位数,范围从1到64。如果M被忽略,默认为1。
如下:mysql> create table tt3(a int unsigned, b int unsigned);Query OK, 0 rows affected (0.06 sec)mysql> insert into tt3 values(1, 2);Query OK, 1 row affected (0.01 sec)mysql> select * from tt3;+------+------+| a    | b    |+------+------+|    1 |    2 |+------+------+1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
1112
13mysql> select a - b from tt3;+----------------------+| a - b                |+----------------------+| 4294967295          |+----------------------+1 row in set (0.00 sec)
1
2
3
4
5
6
7#include <stdio.h>int  main(){    unsigned int  a = 1;    unsigned int  b = 2;    printf ("a-b:%d \t %x \n", a-b, a-b);    printf ("a-b:%u \t %x \n", a-b, a-b);}
1
2
3
4
5
6
7
8a-b:-1          ffffffff a-b:4294967295  ffffffff
1
2mysql> set sql_mode='NO_UNSIGNED_SUBTRACTION';Query OK, 0 rows affected (0.01 sec)mysql> select a - b from tt3;+-------+| a - b |+-------+|    -1 |+-------+
1
2
3
4
5
6
7
8
9
注意:bit字段在显⽰时,是按照ASCII码对应的值显⽰。
如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
2. ⼩数的基本使⽤sql自学难吗
2.1 float
float[(m, d)][unsigned]
m指定显⽰长度,d指定⼩数位数,占⽤空间4个字节
⼩数:float(4,2)表⽰的范围是-99.99 ~ 99.99,MySQL在保存值时会进⾏四舍五⼊。mysql> create ta
ble tt4(id int, a bit(8));Query OK, 0 rows affected (0.04 sec)mysql> insert into tt4 values(10, 10);Query OK, 1 row affected (0.01 sec)mysql> select * from tt4;+------+------+| id  | a    |+------+------+|  10 |    |+------+------+1 row in set (0.00 sec)发现很怪异的现象,a 的数据10没有出现
1
2
3
4
5
6
7
8
9
1011
12
13
14
15
16mysql> insert into tt4 values(65, 65);Query OK, 1 row affected (0.00 sec)mysql> select * from tt4;+------+------+| id  | a    |+------+------+|  10 |    ||  65 | A    |+------+------+2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12mysql> create table tt5(gender bit(1));Query OK, 0 rows affected (0.04 sec)mysql> insert into  tt5 value (0);Query OK, 1 row affected (0.01 sec)mysql> insert into  tt5 value (1);Query OK, 1 row affected (0.01 sec)mysql> insert into  tt5 value (2); -- 当插⼊2时,已经越界了ERROR 1406 (22001): Data too long  for  column 'gender' at row 1
1
2
3
4
5
6
7
8
9
10
11
说明:当我们的float(4,2)如果是⼀个有符号的,则表⽰范围是-99.99 ~ 99.99,如果float(6,3),请同学们说说范围是多少?
如果定义的是float(4,2) unsigned 这时,因为把它指定为⽆符号的数,范围是0 ~ 99.99
2.2 decimal
decimal(m, d) [unsigned]
定点数m指定长度,d表⽰⼩数点的位数
decimal(5,2) 表⽰的范围是-999.99 ~ 999.99
decimal(5,2) unsigned 表⽰的范围0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表⽰的精度不⼀样mysql> create table tt6(id int, salary float(4,2));Query OK, 0 rows affected (0.04 sec)mysql> insert into tt6 values(100, -99.99);Query OK, 1 row affected (0.01 sec)mysql> insert into tt6 values(101, -99.991);Query OK, 1 row affected (0.00 sec)mysql> select * from tt6;  -- 多的这⼀点被拿掉了+------+--------+| id  | salary |+------+--------+|  100 | -99.99 ||  101 | -99.99 |+------+--------+2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18mysql> create table tt7(id int, salary float(4,2) unsigned);Query OK, 0 rows affected (0.04 sec)mysql> insert into tt7 values(100, -0.01); -- 越界ERROR 1264 (22003): Out  of  range  value for  column 'salary' at row 1mysql> insert into tt7 values(100, 0);Query OK, 1 row affected (0.01 sec)mysql> insert into tt7 values(100, 99.99);Query OK, 1 row affected (0.01 sec)mysql> insert into tt7 values(100, 100.00); -- 越界ERROR 1264 (22003): Out  of  range  value for  column 'salary' at row 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。