博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据类型
阅读量:6828 次
发布时间:2019-06-26

本文共 10594 字,大约阅读时间需要 35 分钟。

数据库也是有数据类型的

mysql常用数据类型概览

数字:    整型:tinyinit  int  bigint    小数:        float :在位数比较短的情况下不精准        double :在位数比较长的情况下不精准            0.000001230123123123            存成:0.000001230000        decimal:(如果用小数,则用推荐使用decimal)            精准            内部原理是以字符串形式去存#2. 字符串:    char(10):简单粗暴,浪费空间,存取速度快        root存成root000000    varchar:精准,节省空间,存取速度慢    sql优化:创建表时,定长的类型往前放,变长的往后放                    比如性别           比如地址或描述信息    >255个字符,超了就把文件路径存放到数据库中。            比如图片,视频等找一个文件服务器,数据库中只存路径或url。#3. 时间类型:    最常用:datetime#4. 枚举类型与集合类型
常用数据类型

 

 

数据类型:

         Float double 存储的话碰到小数位特别多的时候会不精准 而decimal精确

Decimal(10,10)前面是总位数后面的是你一共有多少位小数 就是小数点的位数

 

Char和varchar

Char(10)

如果你定义了你的数据是char(10)那么不论你是否存储10个字节他都会在填充为10个字符,

Varchar的话你的数据定义为varchar(10)那么你存储几个在内存都会显示几个 这个节省内存 

但是char查找快  ,因为他是定长 不论是否这么长都自动填充这么长既然知道了这么长就直接按照这么长来查找

优化:把定长char类型放在varchar前面

 注意:

char 或者varchar不论哪个编码只要设置了后面的长度就是设置你添加内容的长度

如:如varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符。 表示的字符长度

你在后面定义的长度可以理解为len长度,不论添加的是数字 英文 或者汉字都是占据了一位 

 

 

整数类型

整数类型:TINYINT SMALLINT MEDIUMINT 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
View Code

 

=========有符号和无符号tinyint==========#tinyint默认为有符号MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号MariaDB [db1]> desc t1;MariaDB [db1]> insert into t1 values    -> (-129),    -> (-128),    -> (127),    -> (128);MariaDB [db1]> select * from t1;+------+| x    |+------+| -128 | #-129存成了-128| -128 | #有符号,最小值为-128|  127 | #有符号,最大值127|  127 | #128存成了127+------+#设置无符号tinyintMariaDB [db1]> create table t2(x tinyint unsigned);MariaDB [db1]> insert into t2 values    -> (-1),    -> (0),    -> (255),    -> (256);MariaDB [db1]> select * from t2;+------+| x    |+------+|    0 | -1存成了0|    0 | #无符号,最小值为0|  255 | #无符号,最大值为255|  255 | #256存成了255+------+============有符号和无符号int=============#int默认为有符号MariaDB [db1]> create table t3(x int); #默认为有符号整数MariaDB [db1]> insert into t3 values    -> (-2147483649),    -> (-2147483648),    -> (2147483647),    -> (2147483648);MariaDB [db1]> select * from t3;+-------------+| x           |+-------------+| -2147483648 | #-2147483649存成了-2147483648| -2147483648 | #有符号,最小值为-2147483648|  2147483647 | #有符号,最大值为2147483647|  2147483647 | #2147483648存成了2147483647+-------------+#设置无符号intMariaDB [db1]> create table t4(x int unsigned);MariaDB [db1]> insert into t4 values    -> (-1),    -> (0),    -> (4294967295),    -> (4294967296);MariaDB [db1]> select * from t4;+------------+| x          |+------------+|          0 | #-1存成了0|          0 | #无符号,最小值为0| 4294967295 | #无符号,最大值为4294967295| 4294967295 | #4294967296存成了4294967295+------------+==============有符号和无符号bigint=============MariaDB [db1]> create table t6(x bigint);MariaDB [db1]> insert into t5 values      -> (-9223372036854775809),    -> (-9223372036854775808),    -> (9223372036854775807),    -> (9223372036854775808);MariaDB [db1]> select * from t5;+----------------------+| x                    |+----------------------+| -9223372036854775808 || -9223372036854775808 ||  9223372036854775807 ||  9223372036854775807 |+----------------------+MariaDB [db1]> create table t6(x bigint unsigned);MariaDB [db1]> insert into t6 values      -> (-1),    -> (0),    -> (18446744073709551615),    -> (18446744073709551616);MariaDB [db1]> select * from t6;+----------------------+| x                    |+----------------------+|                    0 ||                    0 || 18446744073709551615 || 18446744073709551615 |+----------------------+======用zerofill测试整数类型的显示宽度=============MariaDB [db1]> create table t7(x int(3) zerofill);MariaDB [db1]> insert into t7 values    -> (1),    -> (11),    -> (111),    -> (1111);MariaDB [db1]> select * from t7;+------+| x    |+------+|  001 ||  011 ||  111 || 1111 | #超过宽度限制仍然可以存+------+
验证

其实 tinyint 和int bigint三者的区别就是取值范围的不同而已

并且整数类型的列的规定值 只是规定的显示的值不是存储值

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下

其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了

默认的显示宽度,都是在最大值的基础上加1

 

默认的显示宽度,都是在最大值的基础上加1

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

 

#MySQL中无布尔值,使用tinyint(1)构造。create table t14(x int,y boolean);

 

 

 

2、浮点型

定点数类型  DEC等同于DECIMAL  

浮点类型:FLOAT DOUBLE

作用:存储薪资、身高、体重、体质参数等

======================================#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能够存储精确值的原因在于其内部按照字符串存储。
View Code

 

mysql> create table t1(x float(256,31));ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.mysql> create table t1(x float(256,30));ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)mysql> create table t1(x float(255,30)); #建表成功Query OK, 0 rows affected (0.02 sec)mysql> create table t2(x double(255,30)); #建表成功Query OK, 0 rows affected (0.02 sec)mysql> create table t3(x decimal(66,31));ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.mysql> create table t3(x decimal(66,30));ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65.mysql> create table t3(x decimal(65,30)); #建表成功Query OK, 0 rows affected (0.02 sec)mysql> show tables;+---------------+| Tables_in_db1 |+---------------+| t1            || t2            || t3            |+---------------+3 rows in set (0.00 sec)mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(1.1111111111111111111111111111111);Query OK, 1 row affected (0.00 sec)mysql> insert into t3 values(1.1111111111111111111111111111111);Query OK, 1 row affected, 1 warning (0.01 sec)mysql> select * from t1; #随着小数的增多,精度开始不准确+----------------------------------+| x                                |+----------------------------------+| 1.111111164093017600000000000000 |+----------------------------------+1 row in set (0.00 sec)mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确+----------------------------------+| x                                |+----------------------------------+| 1.111111111111111200000000000000 |+----------------------------------+1 row in set (0.00 sec)mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数+----------------------------------+| x                                |+----------------------------------+| 1.111111111111111111111111111111 |+----------------------------------+1 row in set (0.00 sec)
验证

 

位类型(了解)

BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。

注意:对于位字段需要使用函数读取
    bin()显示为二进制
    hex()显示为十六进制

 

MariaDB [db1]> create table t9(id bit);MariaDB [db1]> desc t9; #bit默认宽度为1+-------+--------+------+-----+---------+-------+| Field | Type   | Null | Key | Default | Extra |+-------+--------+------+-----+---------+-------+| id    | bit(1) | YES  |     | NULL    |       |+-------+--------+------+-----+---------+-------+MariaDB [db1]> insert into t9 values(8);MariaDB [db1]> select * from t9; #直接查看是无法显示二进制位的+------+| id   |+------+|     |+------+MariaDB [db1]> select bin(id),hex(id) from t9; #需要转换才能看到+---------+---------+| bin(id) | hex(id) |+---------+---------+| 1       | 1       |+---------+---------+MariaDB [db1]> alter table t9 modify id bit(5);MariaDB [db1]> insert into t9 values(8);MariaDB [db1]> select bin(id),hex(id) from t9;+---------+---------+| bin(id) | hex(id) |+---------+---------+| 1       | 1       || 1000    | 8       |+---------+---------+
验证

三 日期类型

DATE TIME DATETIME TIMESTAMP YEAR 

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

 

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. 单独插入时间时,需要以字符串的形式,按照对应的格式插入2. 插入年份时,尽量使用4位值3. 插入两位年份时,<=69,以20开头,比如50,  结果2050                      >=70,以19开头,比如71,结果1971

 

time 对应的是时间  year对应的是年,date对应的是年月日  ,datetime对应的是年月日时分秒

 

 

这三种对应的不同

 

 

还有一个now()方法

alter table t4 add cc datetime;insert into t1(cc) values(now());我们先创建一个datetime类型的cc列然后用now()求出当前的时间然后插入进去

 

 

 

枚举类型与集合类型

字段的值只能在给定范围中选择,如单选框,多选框

enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

 

枚举类型和集合类型

字段的值只能在给定范围中选择,如单选框,多选框

enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female

set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

mysql> create table consumer(    -> id int,    -> name varchar(50),    -> sex enum('male','female','other'),    -> level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一    -> fav set('play','music','read','study') #在指定范围内,多选多    -> );Query OK, 0 rows affected (0.03 sec)mysql> insert into consumer values    -> (1,'赵云','male','vip2','read,study'),    -> (2,'赵云2','other','vip4','play');Query OK, 2 rows affected (0.00 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> select * from consumer;+------+---------+-------+-------+------------+| id   | name    | sex   | level | fav        |+------+---------+-------+-------+------------+|    1 | 赵云    | male  | vip2  | read,study ||    2 | 赵云2   | other | vip4  | play       |+------+---------+-------+-------+------------+2 rows in set (0.00 sec)

 

 

enum 和set 的区别是enum只能选择后面的一项  而set可以选择多项

 

转载于:https://www.cnblogs.com/zhaoyunlong/p/9169229.html

你可能感兴趣的文章
java中Scanner的nextLine()和next()的区别
查看>>
Dig
查看>>
21:二维数组右上左下遍历
查看>>
android camera(一):camera模组CMM介绍【转】
查看>>
BZOJ 2821: 作诗(Poetize) [分块]
查看>>
TCP协议三次握手过程分析
查看>>
set排序(个人模版)
查看>>
Codeforces Round #404 (Div. 2) D. Anton and School - 2 数学
查看>>
windows进程中的几个杂项-hpguard 进程终止
查看>>
Window 7 + Ubuntu 双系统安装
查看>>
instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)
查看>>
以AVL树为例理解二叉树的旋转(Rotate)操作
查看>>
Maven可以提交到官方公共仓库maven.org
查看>>
学霸也要会看书
查看>>
解读tensorflow之rnn 的示例 ptb_word_lm.py
查看>>
Linux内核--并发【转】
查看>>
关于对FLASH开发,starling、starling feathers、starling MVC框架的理解
查看>>
Nginx的基本配置案例
查看>>
一线架构师带你玩性能优化
查看>>
13. 关于IDEA工具在springboot整合mybatis中出现的Invalid bound statement (not found)问题
查看>>