导航
导航
文章目录
  1. 数值类型
  2. 日期 / 时间类型
  3. 字符串类型
  4. 几个问题
    1. int(10) 与 int(11) 的区别
    2. float
    3. double 与 decimal 区别
    4. datetime 与 timestamp 区别
    5. char(4) 与 varchar(4) 区别
    6. 汉字占字节大小
    7. 其他类型

MySQL 中的数据类型和几个问题

在 MySQL 中,可以通过存储引擎来决定表的类型,即存储引擎决定了表的存储方式;同时 MySQL 中也提供了几种数据类型,而数据类型决定了表存储数据的类型。在这篇文章里,先来简单的介绍 MySQL 中的数据类型。

MySQL 支持多种数据类型,大致可以分为三类:数值、日期 \ 时间、字符串(字符)

数值类型

数值类型又分为整数类型、浮点数类型和定点数类型

日期 / 时间类型

字符串类型

几个问题

int(10) 与 int(11) 的区别

int 占 4 个字节,存储的数据范围见上表,int 后面的数字表示字符显示宽度

  1. 只要数据类型声明为 int,则该列所能存储的整型数据范围是固定的,不管后面的是 10 还是 11,int 的字符显示宽度大小,和能存储的数据范围大小没有关系;
  2. zerofill 表示数据小于字符显示宽度时,左边用 0 填充,直至达到定义的字符显示宽度;
  3. 若数据宽度大于等于字符显示宽度时,则正常存储,不处理该数据;
  4. 字符显示宽度必须和 zerofill 配合使用,不然字符显示宽度无意义;
  5. 使用 zerofill 填充时,会隐式的将该列设置为无符号;
  6. 不设置字符显示宽度和 zerofill 时,int 型默认字符显示宽度为 11。

float

float 存在许多潜在因素,要 尽量避免 使用

  1. 默认只能存储 6 个数字(小数点前后),超过 6 位就会显示为科学记数法,并且 6 位之后的部分会四舍五入舍去;
  2. 设置 float(m),m <= 24 时,精度和不设置 m 一样,都只能存储 6 个数字,m 超过 24 时,会自动转换为 double;
  3. 设置 float(m,d),m 表示整数和小数的最大长度,d 表示小数部分,m-d 表示整数部分,整数部分超过 m-d,插入异常,小数部分大于 d,则从第 5 位开始四舍五入去掉后面的部分,小数部分小于 d,用 0 填充,m = d 时,整数部分必须为 0;
  4. 浮点数存在误差问题,对货币等对精度敏感的数据,应该使用定点数存储。

double 与 decimal 区别

  1. double 浮点型,decimal 定点型;
  2. double 不指定精度,默认按实际的精度显示;
  3. decimal 不指定精度,默认 m = 10,d = 0;
  4. decimal 可以存储比 bigint 更大的整数。

datetime 与 timestamp 区别

  1. 存储范围不同,datetime 范围更大;
  2. 所占空间大小不同,timestamp 只占 4 字节;
  3. datetime 和时区无关,timestamp 和时区有关;
  4. timestamp 将时间从当前时区转化为 UTC 进行存储,查询时又转化为当前时区,datetime 原样存储;
  5. 都可以设置默认值为 CURRENT_TIMESTAMP,在插入和更新时会自动使用当前时间填充;
  6. timestamp 可以指定长度,精度到毫秒级,datetime 不可以;
  7. 对于跨时区的业务,timestamp 更适合。

char(4) 与 varchar(4) 区别

  1. 能存储的最大字符数都是 4 个,超过自动截取,字符包括汉字、英文字母和数字;
  2. char 存储低于 4 个,依然占 4 个字节,varchar 存储低于 4 个,占字符数 + 1 个字节;
  3. varchar 存储的字符数小于等于 255 个时,用 1 个字节记录字符串长度,大于 255 个时,用 2 个字节记录字符串长度。

汉字占字节大小

  1. 一般每个汉字 3 个字节;
  2. 和编码有关。

其他类型

boolean 与 bool MySQL 中没有 boolean 类型,使用 0 和 1 代表 false 和 true,设置一列为 boolean 类型,将会自动转换成 tinyint(1);

enum 枚举类型,从给定的几个值中挑选一个;

set 枚举类型,从给定的几个值中挑选一个或多个;

numeric 同 decimal 类型一样,没有任何区别。