数据库 - 表 - 数据类型
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 +---------------以上是关于数据库 - 表 - 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
片段中的Android ListView - 获取新数据后刷新表的问题
如何将数据从 BottomSheetDialogFragment 返回到父片段
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段