文章目录

  • mysql数据类型汇总
    • 1、整数类型
    • 2、浮点数类型
    • 3、字符串类型
    • 4、枚举类型(ENUM)
    • 5、日期和时间类型
  • 面试题
    • 1. int(10) 和 bigint(10)能存储的数据大小一样吗?
    • 2. varchar存储规则
    • 3. MySQL中varchar最大长度是多少?
    • 4. char和varchar有什么区别?
    • 5. Datetime 和 Timestamp 之间抉择
      • 5.1 DateTime 类型没有时区信息
      • 5.2 扩展:一些关于 MySQL 时区设置的一个常用 sql 命令
      • 5.3 DateTime 类型耗费空间更大
      • 5.4 数值型时间戳是更好的选择吗?
      • 5.5 总结

mysql数据类型汇总

分类 类型名称 说明
整数类型 tinyInt 很小的整数(8位二进制)
smallint 小的整数(16位二进制)
mediumint 中等大小的整数(24位二进制)
int(integer) 普通大小的整数(32位二进制)
BigInt 64位
浮点数类型 float 单精度浮点数
double 双精度浮点数
decimal(m,d) 压缩严格的定点数,共m位,取d位存储小部分,剩下m-d位存储整数部分
日期类型 year YYYY 1901~2155
time HH:MM:SS -838:59:59~838:59:59
date YYYY-MM-DD 1000-01-01~9999-12-3
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
timestamp YYYY-MM-DD HH:MM:SS 19700101 00:00:01 UTC~2038-01-19 03:14:07UTC
文本、二进制类型 CHAR(M) M为0~255之间的整数
VARCHAR(M) M为0~65535之间的整数
TINYBLOB 允许长度0~255字节
BLOB 允许长度0~65535字节
MEDIUMBLOB 允许长度0~167772150字节
LONGBLOB 允许长度0~4294967295字节
TINYTEXT 允许长度0~255字节
TEXT 允许长度0~65535字节
MEDIUMTEXT 允许长度0~167772150字节
LONGTEXT 允许长度0~4294967295字节
VARBINARY(M) 允许长度0~M个字节的变长字节字符串
BINARY(M) 允许长度0~M个字节的定长字节字符串

1、整数类型

  • 包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。

    • 长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。
    • 例子:假定类型设定为INT(5),属性为UNSIGNED ZEROFILL,如果用户插入的数据为12的话,那么数据库实际存储数据为00012。

2、浮点数类型

  • 包括FLOAT、DOUBLE、DECIMAL。

    • DECIMAL可以用于存储比BIGINT还大的整型,能存储精确的小数。而FLOAT和DOUBLE是有取值范围的,并支持使用标准的浮点进行近似计算。计算时FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串进行处理。

3、字符串类型

  • 包括VARCHAR、CHAR、TEXT、BLOB

    • VARCHAR用于存储可变长字符串,它比定长类型更节省空间。VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。VARCHAR存储的内容超出设置的长度时,内容会被截断。
    • CHAR是定长的,根据定义的字符串长度分配足够的空间。CHAR会根据需要使用空格进行填充方便比较。CHAR适合存储很短的字符串,或者所有值都接近同一个长度。CHAR存储的内容超出设置的长度时,内容同样会被截断。

使用策略:

  • VARCHAR是最常见的字符串类型。VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是可变的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,MyISAM会将行拆成不同的片段存储;InnoDB则需要分裂页来使行可以放进页内。

    • 下面这些情况使用VARCHAR是合适的:字符串的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储。
  • 当存储CHAR值时,MySQL会删除所有的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度,如密码的MD5值。对于经常变更的数据,CHAR也比VARCHAR更好,因为CHAR不容易产生碎片(行间碎片?)。

4、枚举类型(ENUM)

把不重复的数据存储为一个预定义的集合。有时可以使用ENUM代替常用的字符串类型。ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。ENUM在内部存储时,其实存的是整数。尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。排序是按照内部存储的整数排序。

5、日期和时间类型

  • DATETIME1. 能够保存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。 2. 它与时区无关。3. 默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。

  • TIMESTAMP: 和 UNIX 时间戳相同,保存从 1970 年 1 月 1 日午夜(格林威治时间)以来的秒数,使用 4 个字节,只能表示从 1970 年 到 2038 年。 它和时区有关,也就是说一个时间戳在不同的时区所代表的具体时间是不同的。 MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提供了 UNIX_TIMESTAMP() 函数把日期转换为 UNIX 时间戳。

    • 默认情况下,如果插入时没有指定 TIMESTAMP 列的值,会将这个值设置为当前时间。应该尽量使用 TIMESTAMP,因为它比 DATETIME 空间效率更高。

面试题

1. int(10) 和 bigint(10)能存储的数据大小一样吗?

不一样,具体原因如下:

  • int 能存储四字节有符号整数。
  • bigint 能存储八字节有符号整数。

所以能存储的数据大小不一样,其中的数字 10 代表的只是数据的显示宽度。

  • 显示宽度指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时数字左边会用空格填充,空格不容易看出。
  • 如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入且能够显示出来。
  • 建表的时候指定 zerofill 选项,则不足显示宽度的部分用 0 填充,如果是 1 会显示成 0000000001。
  • 如果没指定显示宽度, bigint 默认宽度是 20 ,int默认宽度 11。
  • 如果一个数据超过指定的宽度,但是数据大小只要不超过数据类型的最大值依然可以插入成功。

2. varchar存储规则

  • 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
  • 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大的大小是65532字节

3. MySQL中varchar最大长度是多少?

参考文档

varchar底层

4. char和varchar有什么区别?

区别一,定长和变长:

char 表示定长,长度固定;varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。
varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。但是因为他需要有一个prefix来表示他具体bytes数是多少(因为varchar是变长的,没有这个长度值他不知道如何读取数据)。

区别之二,存储的容量不同:

对 char 来说,最多能存放的字符个数 255,和编码无关。而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节

5. Datetime 和 Timestamp 之间抉择

Datetime 和 Timestamp 是 MySQL 提供的两种比较相似的保存时间的数据类型。他们两者究竟该如何选择呢?

通常我们都会首选 Timestamp。 下面说一下为什么这样做!

5.1 DateTime 类型没有时区信息

DateTime 类型是没有时区信息的(时区无关) ,DateTime 类型保存的时间都是当前会话所设置的时区对应的时间。这样就会有什么问题呢?当你的时区更换之后,比如你的服务器更换地址或者更换客户端连接时区设置的话,就会导致你从数据库中读出的时间错误。不要小看这个问题,很多系统就是因为这个问题闹出了很多笑话。

Timestamp 和时区有关。 Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样。 下面实际演示一下! 建表 SQL 语句:

建表SQL语句:

CREATE TABLE `time_zone_test` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`date_time` datetime DEFAULT NULL,`time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());

查看数据

select date_time,time_stamp from time_zone_test;

结果

修改当前会话的时区

set time_zone = '+10:00'

再次查看数据

5.2 扩展:一些关于 MySQL 时区设置的一个常用 sql 命令

# 查看当前会话时区
SELECT @@session.time_zone;
# 设置当前会话时区
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
# 数据库全局时区设置
SELECT @@global.time_zone;
# 设置全局时区
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';

5.3 DateTime 类型耗费空间更大

Timestamp 只需要使用 4 个字节的存储空间,但是 DateTime 需要耗费 8 个字节的存储空间。但是,这样同样造成了一个问题,Timestamp 表示的时间范围更小。

  • DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
  • Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59

Timestamp 在不同版本的 MySQL 中有细微差别。

5.4 数值型时间戳是更好的选择吗?

很多时候,我们也会使用 int 或者 bigint 类型的数值也就是时间戳来表示时间。

这种存储方式的具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,毕竟只是存放的数值。缺点也很明显,就是数据的可读性太差了,你无法直观的看到具体时间。

数据库中实际操作:

mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-01-11 09:53:32') |
+---------------------------------------+
|                            1578707612 |
+---------------------------------------+
1 row in set (0.00 sec)mysql> select FROM_UNIXTIME(1578707612);
+---------------------------+
| FROM_UNIXTIME(1578707612) |
+---------------------------+
| 2020-01-11 09:53:32       |
+---------------------------+
1 row in set (0.01 sec)

5.5 总结

每种方式都有各自的优势,根据实际场景才是王道。下面再对这三种方式做一个简单的对比,以供大家实际开发中选择正确的存放时间的数据类型。

MySQL面试 (一) 数据类型相关推荐

  1. 最全MySQL面试60题和答案

    Mysql中有哪几种锁? 1.表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 2.行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也 ...

  2. 去腾讯等BAT面试完的Mysql面试55题总结,含答案大赠送!

    [BAT面试:mysql 面试55题] 1.一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18还 ...

  3. MySQL 面试,必须掌握的 8 大核心点

    上周末和在北京的哥们国仔涮火锅,席间聊起了最近面试的经历. 他说想换工作的原因很简单,就是要涨工资,原来的公司呆了两年多,薪资浮动不超过 500 元.而身边跳槽的那些同事,薪资都已经是自己的 2 倍了 ...

  4. MySQL 面试必备 8 个知识点

    上周末和在北京的哥们国仔涮火锅,席间聊起了最近面试的经历. 他说想换工作的原因很简单,就是要涨工资,原来的公司呆了两年多,薪资浮动不超过 500 元.而身边跳槽的那些同事,薪资都已经是自己的 2 倍了 ...

  5. MySQL 面试,必须掌握的 8 个知识点

    上周末和在北京的哥们国仔涮火锅,席间聊起了最近面试的经历. 他说想换工作的原因很简单,就是要涨工资,原来的公司呆了两年多,薪资浮动不超过 500 元.而身边跳槽的那些同事,薪资都已经是自己的 2 倍了 ...

  6. 【大话Mysql面试】-常见SQL语句书写

    [大话Mysql面试]-常见SQL语句书写 4.1 SQL语句主要分为哪几类? 数据定义语言DDL(Data Defination Language):主要为create drop alter等操作, ...

  7. 手撸架构,Mysql 面试126问

    技术栈 传送门 JAVA 基础 手撸架构,Java基础面试100问_vincent-CSDN博客 JAVA 集合 手撸架构,JAVA集合面试60问_vincent-CSDN博客 JVM 虚拟机 手撸架 ...

  8. MySQL面试常见题目(六)

    原文地址:MySQL面试常见题目(六) 1.字段为何需定义NOT NULL? NULL会占用更多字节,且NULL有很多坑. 2.如需存储用户密码散列,应使用什么字段? 应使用char,可节省空间且提高 ...

  9. MySQL面试经典100题(收藏版,附答案)

    写在前面: 面试题系列终于在今天正式开启了,只有精心的准备才能打好每一战,为此我们都在努力着,面试题系列文章本着由简入繁的原则,持续更新,希望小伙伴们可以一起努力! 数据库 1. MySQL 索引使用 ...

最新文章

  1. python如何自定义模块_python自定义模块和开源模块使用方法
  2. Windows注册表修改实例完全手册(下)
  3. JMX之模型MBean
  4. 968. 监控二叉树(递归+贪心)
  5. 学习MySQL我们应该知道哪些东西?
  6. Spark SQL程序实现RDD转换DataFrame
  7. 把自定义url配置到SAP Fiori Launchpad上打开
  8. leetcode242. 有效的字母异位词(两种方法map或数组)
  9. [转+整理]十道海量数据处理面试题与十个方法大总结
  10. 重建控制文件--Rebuild controlfile
  11. SQL Server审核最佳做法
  12. UVa 10491 - Cows and Cars(全概率)
  13. 提升技能必备网站(不定时更新)
  14. PHP集成环境 Xampp,PHPwamp等等国内外著名的集成环境
  15. 我用Python的Matplotlib库绘制25个超好看图表
  16. windows系统更新失败无法启动的解决方法
  17. unbuntu下载编译chromium
  18. 软件测试的艺术-读书笔记-0
  19. 几种编码方式(RZ、NRZ、NRZI、曼彻斯特编码)
  20. 月份, 星期的英语简写

热门文章

  1. guns框架分页实现
  2. Java jdk proxy、cglib、aspectj 三种常用代理示范
  3. PS平面设计教程nbsp;利用路径及画…
  4. 国家地理信息服务平台——天地图使用指南
  5. steam android app,steam手机客户端下载
  6. 医院患者监护系统的问题定义和可行性研究
  7. 考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型
  8. JavaWeb(引用-->狂神学习笔记)2021-08
  9. python如何限定输入类型_关于python:如何确定输入的类型?
  10. 分类目录站和网址导航站的区别