数据库 - 表 - 数据类型

Posted Alice的小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 - 表 - 数据类型相关的知识,希望对你有一定的参考价值。

数据类型:
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
参考:
http://www.runoob.com/mysql/mysql-data-types.html
http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html

mysql常用数据类型概览:
1.数值类型:
整数类型:tinyint smallint int bigint
浮点型:float double decimal
float :在位数比较短的情况下不精准(一般float得精确度也够用了)
double :在位数比较长的情况下不精准
0.000001230123123123
存成:0.000001230000
decimal:(如果用小数,则推荐使用decimal)
精准 内部原理是以字符串形式去存
2.日期类型:
最常用:datetime year date time datetime timestamp
3.字符串类型:
char(6) varchar(6)
char(10):简单粗暴,浪费空间,存取速度快,定长;
root存成root000000
varchar:精准,节省空间,存取速度慢,变长;

sql优化:创建表时,定长的类型往前放,变长的往后放
比如性别 比如地址或描述信息

>255个字符,超了就把文件路径存放到数据库中。
比如图片,视频等找一个文件服务器,数据库中只存路径或url。
4.枚举类型与集合类型:
enum(\'male\',\'female\')
set(\'play\',\'music\',\'read\',\'study\')

一、数值类型:
1.整数类型:
整数类型:tinyint int bigint ...
作用:存储年龄,等级,id,各种号码等

                 


规则:
========================================
tinyint[(m)] [unsigned] [zerofill]

小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127
无符号:
0 ~ 255

PS: MySQL中无布尔值,使用tinyint(1)构造。
========================================
int[(m)][unsigned][zerofill]

整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
========================================
bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
========================================
验证:
 1             mysql> create table t1(x tinyint);  # 默认是有符号的 -128,127
 2             mysql> insert into t1 values(-129),(128);
 3             mysql> select * from t1;   # 若是 超出范围 它会自动到 -128 127
 4             +------+
 5             | x    |
 6             +------+
 7             | -128 |
 8             |  127 |
 9             +------+
10 
11             mysql> create table t2(x tinyint unsigned);  # 无符号的
12             mysql> insert into t2 values(-1),(256);
13             mysql> select * from t2;
14             +------+
15             | x    |
16             +------+
17             |    0 |
18             |  255 |
19             +------+
20 
21             mysql> create table t3(id int(1) unsigned);
22             mysql> desc t3;
23             +-------+-----------------+------+-----+---------+-------+
24             | Field | Type            | Null | Key | Default | Extra |
25             +-------+-----------------+------+-----+---------+-------+
26             | id    | int(1) unsigned | YES  |     | NULL    |       |
27             +-------+-----------------+------+-----+---------+-------+
28             mysql> insert into t3 values(2555555555);
29             mysql> insert into t3 values(213123123213231232131212312);
30             mysql> select * from t3;
31             +------------+
32             | id         |
33             +------------+
34             | 2555555555 |
35             | 4294967295 |
36             +------------+
37             int 型 不需要加宽度;  int(1) # 1 不是 指的存储宽度 而是 显示宽度
38                 存储宽度:tinyint int  存储宽度 都固定死了 你不能修改
39                 显示宽度: 指的是 查询时 select * from t4 ;
40                     mysql> create table t5(id int(5) unsigned zerofill);
41                     mysql> insert into t5 values(1);
42                     mysql> select * from t5;
43                     +-------+
44                     | id    |
45                     +-------+
46                     | 00001 |
47                     +-------+
48                     mysql> insert into values(12345671222222222222);
49                     mysql> select * from t5;   # 超过5位了就正常显示了,所以说显示宽度对于int来说没有意义;
50                     +------------+
51                     | id         |
52                     +------------+
53                     |      00001 |
54                     | 4294967295 |
55                     +------------+
56                 默认得显示宽度: int(0-4294967295)(-2147483648-2147483647)
57                     mysql> create table t6(id int unsigned);  # 默认得无符号得宽度 是10
58                     mysql> desc t6;
59                     +-------+------------------+------+-----+---------+-------+
60                     | Field | Type             | Null | Key | Default | Extra |
61                     +-------+------------------+------+-----+---------+-------+
62                     | id    | int(10) unsigned | YES  |     | NULL    |       |
63                     +-------+------------------+------+-----+---------+-------+
64                     mysql> create table t7(id int);   # 默认得有符号得宽度 是11
65                     mysql> desc t7;
66                     +-------+---------+------+-----+---------+-------+
67                     | Field | Type    | Null | Key | Default | Extra |
68                     +-------+---------+------+-----+---------+-------+
69                     | id    | int(11) | YES  |     | NULL    |       |
70                     +-------+---------+------+-----+---------+-------+
71                     1 row in set (0.03 sec)
整数类型

注: int(3) 表示得是显示宽度,不是存储宽度 ,自己没有必要指定,
其他所有类型得,指定得宽度都表示存储宽度。
2.浮点型:
浮点类型:float double decimal=dec
作用:存储薪资、身高、体重、体质参数等
规则:
======================================
#FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
定义:
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
有符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
无符号:
1.175494351E-38 to 3.402823466E+38
精确度:
**** 随着小数的增多,精度变得不准确 ****
======================================
#DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
定义:
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
有符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
无符号:
2.2250738585072014E-308 to 1.7976931348623157E+308
精确度:
****随着小数的增多,精度比float要高,但也会变得不准确 ****
======================================
decimal[(m[,d])] [unsigned] [zerofill]
定义:
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
精确度:
**** 随着小数的增多,精度始终准确 ****
对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
======================================
验证:
 1             mysql> create table t1(x float(256,31));
 2             ERROR 1425 (42000): Too big scale 31 specified for column \'x\'. Maximum is 30.
 3             mysql> create table t1(x float(256,30));
 4             ERROR 1439 (42000): Display width out of range for column \'x\' (max = 255)
 5             mysql> create table t1(x float(255,30)); #建表成功
 6             Query OK, 0 rows affected (0.02 sec)
 7 
 8             mysql> create table t2(x double(255,30)); #建表成功
 9             Query OK, 0 rows affected (0.02 sec)
10 
11             mysql> create table t3(x decimal(66,31));
12             ERROR 1425 (42000): Too big scale 31 specified for column \'x\'. Maximum is 30.
13             mysql> create table t3(x decimal(66,30));
14             ERROR 1426 (42000): Too-big precision 66 specified for \'x\'. Maximum is 65.
15             mysql> create table t3(x decimal(65,30)); #建表成功
16             Query OK, 0 rows affected (0.02 sec)
17 
18             mysql> show tables;
19             +---------------+
20             | Tables_in_db1 |
21             +---------------+
22             | t1            |
23             | t2            |
24             | t3            |
25             +---------------+
26             rows in set (0.00 sec)
27 
28             mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1
29             Query OK, 1 row affected (0.01 sec)
30 
31             mysql> insert into t2 values(1.1111111111111111111111111111111);
32             Query OK, 1 row affected (0.00 sec)
33 
34             mysql> insert into t3 values(1.1111111111111111111111111111111);
35             Query OK, 1 row affected, 1 warning (0.01 sec)
36 
37             mysql> select * from t1; #随着小数的增多,精度开始不准确
38             +----------------------------------+
39             | x                                |
40             +----------------------------------+
41             | 1.111111164093017600000000000000 |
42             +----------------------------------+
43             row in set (0.00 sec)
44 
45             mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确
46             +----------------------------------+
47             | x                                |
48             +----------------------------------+
49             | 1.111111111111111200000000000000 |
50             +----------------------------------+
51             row in set (0.00 sec)
52 
53             mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数
54             +----------------------------------+
55             | x                                |
56             +----------------------------------+
57             | 1.111111111111111111111111111111 |
58             +----------------------------------+
59             row in set (0.00 sec)
浮点型

注:精度最高得是 decimal double float

二、日期类型:
YEAR DATE TIME DATETIME TIMESTAMP
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
规则:
YEAR
YYYY(1901/2155)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS(\'-838:59:59\'/\'838:59:59\')
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
验证:
 1             ============year===========
 2             MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)
 3             MariaDB [db1]> insert into t10 values
 4                 -> (1900),
 5                 -> (1901),
 6                 -> (2155),
 7                 -> (2156);
 8             MariaDB [db1]> select * from t10;
 9             +-----------+
10             | born_year |
11             +-----------+
12             |      0000 |
13             |      1901 |
14             |      2155 |
15             |      0000 |
16             +-----------+
17 
18             ============date,time,datetime===========
19             MariaDB [db1]> create table t11(d date,t time,dt datetime);
20             MariaDB [db1]> desc t11;
21             +-------+----------+------+-----+---------+-------+
22             | Field | Type     | Null | Key | Default | Extra |
23             +-------+----------+------+-----+---------+-------+
24             | d     | date     | YES  |     | NULL    |       |
25             | t     | time     | YES  |     | NULL    |       |
26             | dt    | datetime | YES  |     | NULL    |       |
27             +-------+----------+------+-----+---------+-------+
28 
29             MariaDB [db1]> insert into t11 values(now(),now(),now());
30             MariaDB [db1]> select * from t11;
31             +------------+----------+---------------------+
32             | d          | t        | dt                  |
33             +------------+----------+---------------------+
34             | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 |
35             +------------+----------+---------------------+
36 
37             ============timestamp===========
38             MariaDB [db1]> create table t12(time timestamp);
39             MariaDB [db1]> insert into t12 values();
40             MariaDB [db1]> insert into t12 values(null);
41             MariaDB [db1]> select * from t12;
42             +---------------------+
43             | time                |
44             +---------------------+
45             | 2017-07-25 16:29:17 |
46             | 2017-07-25 16:30:01 |
47             +---------------

以上是关于数据库 - 表 - 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript笔试题(js高级代码片段)

片段中的Android ListView - 获取新数据后刷新表的问题

错误3004:从行开始映射片段时出现问题

如何将数据从 BottomSheetDialogFragment 返回到父片段

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

视图或片段库为常见数据类型组成 UI