目录

MySQL从零开始了解数据库开发-数据类型

【MySQL】从零开始了解数据库开发 — 数据类型

https://i-blog.csdnimg.cn/direct/55bd665756114989935c8aa868c06a61.png

我不假思索地上路,

因为出发的感觉太好了,

世界突然充满了可能性。

— 杰克·凯鲁亚克 —


MySQL中的数据类型

MySQL数据库汇中,每一条数据都有其类型,主要分为三类:数字类型,字符串类型,日期时间类型。下面我们依次来介绍

数字类型

类型分类数据类型描述
数字类型INT整数类型,用于存储整数。 有符号 -231 ~ 231-1
数字类型TINYINT小整数类型,用于存储非常小的整数。有符号 -128 ~ 127
数字类型SMALLINT小整数类型,用于存储较小的整数。 有符号 -215 ~ 215-1
数字类型MEDIUMINT中等大小整数类型,用于存储中等大小的整数。
数字类型BIGINT大整数类型,用于存储大整数。 有符号 -263 ~ 263-1
数字类型FLOAT[(M , D)]单精度浮点数类型,用于存储单精度浮点数。 M指定长度,D指定小数位数
数字类型DOUBLE [(M , D)]双精度浮点数类型,用于存储双精度浮点数。
数字类型DECIMAL [(M , D)]定点数类型,用于存储精确的小数。
数字类型BIT(M)位类型。M指定位数,默认值1 ,范围1-64

数字类型分为了整型,浮点型,位类型。创建表时可以选择合适的数据类型进行储存

我们先来看整型:我们创建这样一个表https://i-blog.csdnimg.cn/direct/88961d3682634a8d836c47266d730de5.png

注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型 但是也一定要注意使用合适的类型,对于数据库庞大的数据,每一个都浪费一点,那么会造成很大的资源浪费!

再来看字节类型BIT(M),我们创建一个表:https://i-blog.csdnimg.cn/direct/23ff08234a0640c987d0a1729f9d868b.png

最后来看浮点数:
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

创建一张这个表
https://i-blog.csdnimg.cn/direct/a227c3ebe5d848aebc15f19380931e52.png

当把数据类型改为float时,如果数值超出其储存范围,会出现损失精度的现象:
https://i-blog.csdnimg.cn/direct/dccdc83b16c646a8880a598091961adb.png
对于float无法储存的数据,这里建议使用decimal。
https://i-blog.csdnimg.cn/direct/7694e61f59fe499295d0192d9c21b4ed.png
我们建立一个这样的表,插入同样的数据:

https://i-blog.csdnimg.cn/direct/7e75ab6d131c41a79c8c672d02796b2e.png
decimal的精度显然更高!

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
建议:如果希望小数的精度高,推荐使用decimal。

字符串类型

类型分类数据类型描述
字符串类型VARCHAR变长字符串类型,用于存储可变长度的字符串。 最多只能是65535
字符串类型CHAR定长字符串类型,用于存储固定长度的字符串。 最多只能是255
字符串类型TEXT文本类型,用于存储长文本。
字符串类型TINYTEXT微型文本类型,用于存储非常短的文本。
字符串类型MEDIUMTEXT中等长度文本类型,用于存储中等长度的文本。
字符串类型LONGTEXT长文本类型,用于存储非常长的文本。
字符串类型BLOB二进制大对象类型,用于存储二进制数据。
字符串类型TINYBLOB微型二进制大对象类型,用于存储非常小的二进制数据。
字符串类型MEDIUMBLOB中等长度二进制大对象类型,用于存储中等长度的二进制数据。
字符串类型LONGBLOB长二进制大对象类型,用于存储非常长的二进制数据。
字符串类型ENUM枚举类型,用于存储枚举值,即一组预定义的字符串。
字符串类型SET集合类型,用于存储一组预定义的字符串,可以包含多个值。

字符串类型最典型的就是 char与varchar。我们先来看char,这是一个固定长度的字符串,我们的插入必须是小于等于其长度。
https://i-blog.csdnimg.cn/direct/35426fead2e64deeb236376b2cb42357.png
这里发现汉字和英语字母都是最大插入三个,但是utf8编码中汉字是占3个字节,所以:mysql中的字符与c/c++中不同 ,字符可以是字母或汉字。c/C++中字符就是一个字节,mysql不是!

再来看varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节。
https://i-blog.csdnimg.cn/direct/158b9887d03047a6846fa008a070fed2.png
这里性质与char一致,大于其长度的无法插入。
再来看这样一个现象,当我们想要修改varchar的储存长度为65535时,会出现一个报错:
https://i-blog.csdnimg.cn/direct/d0463c225fa04ff5b115851e55b25b39.png
提升我们不能扩展到65535,而只能到16383。这里是因为根据字符集的规定,中文字符可能会使用不同的字节数:

  • 如果你使用的是utf8mb4字符集(MySQL推荐使用的完整UTF-8编码),每个中文字符确实占用4个字节
  • 如果是utf8字符集,每个中文字符占用3个字节
  • 如果是latin1字符集,每个中文字符可能无法正常存储

所以对于utf8mb4字符集字符集65535个字节最多只能储存16383个中文字符!

varchar(len)与编码密切相关!varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532

https://i-blog.csdnimg.cn/direct/dec6230479414ca3899573548f1d675b.png
如果储存的长度过长,建议使用大文本储存。

如何选择定长或变长字符串?

  1. 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  2. 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
  3. 定长的磁盘空间比较浪费,但是效率高。
  4. 变长的磁盘空间比较节省,但是效率低。
  5. 定长的意义是,直接开辟好对应的空间
  6. 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
  7. 两者的关系与 c/c++中的 char[ ] 与 string 很相似

日期类型

类型分类数据类型描述
日期类型DATE日期类型,用于存储日期值(年-月-日)。
日期类型TIME时间类型,用于存储时间值(时:分:秒)。
日期类型DATETIME日期时间类型,用于存储日期和时间值(年-月-日 时:分:秒)。
日期类型TIMESTAMP时间戳类型,用于存储时间戳值,表示自1970-01-01 00:00:00 UTC以来的秒数。

常用的日期有如下三个:

  1. date :日期 ‘yyyy-mm-dd’ ,占用三字节。记录需要储存的时间日期
  2. datetime :时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节。记录需要储存的时间日期
  3. timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。一个表中可以有多个TIMESTAMP字段,但只有一个可以设置为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。这个是记录数据的创建/修改时间。

https://i-blog.csdnimg.cn/direct/07b86fde1e814e94af4977e570a7378e.png