古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。
上一章简单介绍了 MySQL的数据库database(二),如果没有看过,请观看上一章
老蝴蝶这一章节所引用的图 均来源 刘增杰 前辈的那本 MySQL 5.7 从入门到精通 那本书。
一. MySQL的数据类型
在Java 中,有八个基本的数据类型和其他的引用类型, 如 int, double, char, String 等。 其中, int 修饰的属性类型是 整数,表示某个对象的这个属性值只能是整数, 不能是小数类型, double表示这个属性值只能是小数类型,不能是字符串类型, String表示 这个属性值只能是字符串类型,不能是整数或者是小数类型。 而 MySQL 是专门用来存储和管理数据的,当然也定义了很多数据的类型,如数值型,字符串型,日期型。 由于存储时需要占用内存相应的容量,为了尽可能的节省资源(数据量小时是没有多大事的,就像老蝴蝶平时学习和工作时数据量小,所以数据库的数据类型都是建立常用的,可在大数据时代,就不好说了),又将某种类型,如数值型,进行更细的划分。 对于这些数据类型,我们只需要了解即可, 不需要在实际业务中很准确的使用。 就像整数类型年龄, 你用int 定义,还是用 smallint 定义,没有多大的区别。 相反,为了与实体保持一致,还推荐使用 int 定义呢, 还有关于年份 year, 老蝴蝶都是 用int 整数型定义,而不是用mysql 的日期类型的 year 定义。 所以,这一章节老蝴蝶只讲解常用的数据类型。
MySQL的数据类型分类:
- 数值类型
- 整数类型
- tinyint
- smallint
- mediumint
- int
- bigint
- 浮点小数类型
- float
- double
- 定点小数类型
- decimal
- 日期时间类型
- 日期
- Year
- Date
- 时间
- Time
- 日期和时间
- Datetime
- timestamp
- 字符串类型
- 文本字符串
- char
- varchar
- binary
- varbinary
- text
- set
- enum
- 二进制字符串
- blob
二 数值类型
二.一 整数类型
整数类型有 tinyint,smallint,mediumint,int,bigint 五种类型。 均可以用 AUTO_INCREMENT 来自动增长。
1 . 所占的字节数
与java 一样,所占的字节数越小,能表示的取值范围越小, 所占的字节数越大,取值范围越大。
2 . 取值范围
3 . 定义表中的属性 类型时, 常用的是 int(4) , 其中(4) 指的是显示的文本宽度,并不是能插入的整数最大的宽度,也不是指的字节数。 其中,只要不超过int的最大范围 即 2147483647的话均可以正常的插入, 它的字节数仍然是 4个字节。 1可以正常插入,9999也可以正常插入,10000也可以正常插入, 1000000000 也可以正常的插入。
如将 user 表中的 age 长度设置成 2.
插入数据,
可以正常的插入,不报错。
查询时: (select * from user; 后面会讲查询语句)
也可以正常的显示。
4 . int 类型默认的长度是 11 位。 最大值 2147483647.length() +1
5 . 通常直接使用 int 类型即可。
二.二 浮点数
1 . 浮点类型有两种, 单精度浮点数(float) 和双精度浮点数(double)
2 .浮点数可以用 (M,N) 来表示, 其中 M称为精度, 是总共的位数, N是标度, 是小数的位数。 小数点不算位。 如 double(4,2) 能存入的最大值是 99.99, 并不是9.99 . 即: 整数部分是 M-N, 小数部分是N.
3 . float 和double 所占的字节数
4 . float 和double 所表示的取值范围
5 . 如果插入的数字的精度范围超出了标度范围,会进行四舍五入的处理。 如 double(4,2) 如果插入的值是99.123 , 小数点位数是3位,超过了规定的2位,是能够正确的插入的,但要进行四舍五入的处理,实际存储到数据库中的值 是 99.12, 如果插入的值是 99.129, 那么存储到数据库中的就是99.13
二.二 定点数
1 . 定点数只有一种, Decimal
2 .定点数也可以用 (M,N) 来表示。 其中,M表示精度,是总共的位数,N是标度,是小数的位数。
3 . 所占的字节数
4 . Decimal 实际是以字符串进行存放的
5 . Decimal 如果不指定精度,默认是 (10,0)
二.二 浮点数与定点数的比较
1 . 在长度一定的情况下, 浮点数比定点数表示的范围大, 但会引起精度问题。
2 . 在对数据精度要求较高时,如 财务,科学数据等, 会Decimal ,其他情况下,一般都用浮点数。
3 . 浮点数在进行加,减运算时, 所得出的结果不一定是正确的结果, 就像JS 中的浮点数运算一样。 如 1+0.9999999, 不一定是 1.9999999,可能是 1.9999999000000002
三. 日期和时间
日期和时间的类型有: Year, Time, Date, DateTime, Timestamp
字节数和取值范围:
三.一 Year
只存入年份。 一般用 int(4) 进行代替。 不常用
三.二 Time
只存入时间。 格式是: HH:MM:SS .一般不会只存入时间,会存入整个 日期+时间。 不常用。
三.三 Date
1 .只存入日期, 不存入时间。
2 .存储格式是: YYYY-MM-DD
3 . 在插入数据的时候,要注意格式是否符合。
可以插入: YYYY-MM-DD, YYYYMMDD, YY-MM-DD, YYMMDD 四种形式。
如插入数据时, 可以直接 插入 ‘2019-11-14’,‘20191114’ 属性值,但不能插入 ‘2019年11月14日’。 后者想要插入时,可以使用 to_date() 函数进行转换。
Date 类型很常用。
三.四 DateTime
1 .既存入日期,也存入时间。
2 .存入的格式是: YYYY-MM-DD HH:MM:SS
3 . 在插入数据的时候,要注意格式是否符合。
可以插入 : YYYY-MM-DD HH:MM:SS , YYYYMMDDHHMMSS, YY-MM-DD HH:MM:SS, YYMMDDHHMMSS 四种形式。
4 . 输入什么,就存储什么,与时区无关。
三.五 TimeStamp
1 .TimeStamp, 时间戳, 可以存入日期和时间。
2 .存入的格式与 dateTime 相同。但timeStamp 只占用了4个字节,所能存入的范围是 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07, 所以要想存入 2038年之后的日期数据,就不能使用 timestamp了。
3 .以 UTC 格式进行存储, 存储时对当前时区进行转换, 检索时再转换为当前时区。 在查询的时候,即使存入的是相同的日期时间值, 也会因为时区的不同,而显示不同的时间。
如创建一个表, 类型是 timestamp, 存入的是当前的日期值, 然后改变时区,再次查询。 (关于表的操作,下一章节会详细讲解)
(默认已经 开启了数据库服务,并且连接了数据库)
3.1 . 使用 yuejl 数据库
3.2 . 创建 表t , 里面有一个 n的字段, 是timestamp 类型
3.3 . 插入当前的日期数据
3.4 . 查询一下值,当前的时区是 上海,东八区。
3.5 . 更改一下时区,为东九区, 日本时间。 set time_zone=’+09:00’;
3.6 . 再次查询,以东九区进行查询
发现,相同的时间,在检索查询时,竟然变了。
3.7 . 重新更改为 东八区。 set time_zone=’+08:00’;
4 . 当插入一条记录时,没有指定 timestamp的列值的话,会自动将当前时间设置为属性值。 所以,当插入记录同时插入当前时间的话,用它是方便的。 同时,在空间上也比datetime更有效。
四. 字符串类型
- 字符串存储时的类型有: char,varchar,tinytext,text,medinumtext,longtext,enum,set .
- 存储需求:
四.一 char
1 .char 是固定长度字符串。
2 . 所能存储的范围是 0~255个字符,与编码无关
3 . 当插入的字符长度不足时,在右侧进行填空格补充
在检索的时候,如果尾部有空格,则先将空格删除后,才进行展示。
4 .定长,所以效率高。 通常用于固定长度的数据存储, 如性别,身份证号等。
四.二 varchar
- varchar 是长度可变的字符串, 所能存储的范围是 0~65535.
- 可以存储65532个字节的数据, 起始位和结束位要占去3个字节,即-1 -2.
-1 是因为实际行存储从第二个字节开始
-2 是因为 varchar头部的2个字节表示长度。
3 . 最大的实际长度,是由最长的行的大小和使用的字符集确定, 而实际占用的空间为字符串的实际长度+1 .
如果编码类型是 gbk, 每个字符最多占2个字节,最大长度不超过 32766. 即 (65535-3)/2
如果编码类型是 utf8, 每个字符最多占3个字节, 最大长度不超过 21844. 即(65535-3)/3
4 . 当插入的字符长度不足时, 不需要在右侧进行填空格补充。 所以,当保存和检索时,发现尾部有空格,那是插入的字符自带的空格, 要进行保留。
5 . char(4) 和varchar(4) 存储时的区别:
四.三 text
用于非常大的字符串, 当超过65535长度之后使用的。 如存储一部小说的内容。
有 tinytext, text,medinumtext,longtext 四种。
不同的text类型的存储空间和数据长度不同。
一般存储时,直接用 varchar 即可。
如果内容过长时,常常将内容放置到一个文件里面,mysql数据库里面存放的是文件的路径。 在项目里面,用InputStream 去读取 file(路径) 里面的内容,进行展示出来。
四.四 枚举 Enum
网上有详细的教程, 但不建议使用, 所以老蝴蝶不写教程了。
四.五 集合 Set
网上有详细的教程,但也不建议使用,所以老蝴蝶也不写教程了。
四.六 二进制 Blob
二进制 Blob, 主要存储的是二进制数据, 如图片,视频等。 是的,MySQL数据库可以直接存储图片。 但没有人会这么用,一般存储的是图片的所在路径。
所具有的类型有, Bit, Binary, Varbinary,Tinyblob,Blob,MediumBlob, LogBlob.
占用字节数:
但一般不用Blob存储,而是存放在磁盘中的路径,进行展示。
五. 如何选择数据类型
为了优化存储,提高数据库性能,在任何情况下均应该使用最精确的类型。 但往往实际运用,却是哪个方便用哪个。 在学习的过程中,老蝴蝶建议也是哪个方便用哪个。
五.一 整数和浮点数,定点数
如果不需要小数部分,如年龄之类的, 直接用 int 类型。
如果有小数部分,但不是财务数据,科学数据之类的,直接用 double 类型。 如果 是财务数据,或者科学数据,用decimal
五.二 日期和时间
如果只记录年份, 用int(4) 即可,不需要用Year.
如果 只记录日期, 用date 即可。
如果需要记录日期和时间,用datetime.
如果当插入数据同时还要插入当前时间,用 timestamp.
如果没有特殊说明, 就用datetime.
五.三 字符串
固定长度,但不是主键的, 如身份证号 用char,
其他的都用 varchar .
Enum, Set, Blob,Text 均不建议使用。
谢谢!!!