MySQL有哪些数据类型和存储机制原理

  

本文主要给大家简单讲讲MySQL有哪些数据类型和存储机制原理,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL有哪些数据类型和存储机制原理这篇文章可以给大家带来一些实际帮助。

1.1数据类型概览

数据类型算是一种字段约束,它限制每个字段能存储什么样的数据,能存储多少数据,能存储的格式等.MySQL/MariaDB大致有5类数据类型,分别是:整形,浮点型,字符串类型,日期时间型以及特殊的枚举和集合类型。

这5种数据类型的意义,限制和相关说明如下图所示:

 MySQL有哪些数据类型和存储机制原理

各数据类型占用字节数,参见MariaDB官方手册。

1.2存储机制和操作方式

数据类型之所以能限定字段的数据存储长度,是因为在创建表时在内存中严格划定了地址空间,地址空间的长度是多少就能存储多少字节的数据。当然,这是一个很粗犷的概念,更具体的存储方式见下面的描述。

数据类型限定范围的方式有两种:一是严格限定空间,划分了多少空间就只能存储多少数据,超出的数据将被切断;二是使用额外的字节的比特位来标记某个地址空间的字节是否存储了数据,存储了就进行标记,不存储就不标记。

1.2.1整型的存储方式

此处主要说明整型的存储方式,至于浮点型数据类型的存储方式要考虑的东西太多。

对于整型数据类型来说,它严格限定空间,但它和字符不同,因为每个已划分的字节上的比特位上的0和1直接可以计算出数值,所以它的范围是根据比特位的数量值来计算的。一个字节有8个比特位,这8个比特位可以构成2 ^ 8=256个数值,同理2字节的共2 ^ 16=65536个数值,4字节的int占用32位,可以表示的范围为0 - 2 ^ 32。也就是说,在0 - 255之间的数字都只占用一个字节,256 - 65535年之间的数字需要占用两个字节。

需要注意,在MySQL/MariaDB中的整型数据类型可以使用参数M, M是一个正整数,例如int (M),非常小的整数(M)。这个米表示的是显示长度,如int(4)表示在输出时将显示4位整数,如果实际值的位数小于显示值宽度,则默认使用空格填充在左边。而结果位数超出时将不影响显示结果。一般该功能都会配合补零属性用0代替空格填充,但是使用了补零后,该列就会自动变成无符号字段。例如:

 CREATE TABLE test3 (id int(2)补零NOT NULL),插入test3值(1),(2),(11),(111);从test3选择id;
  +-----+
  | | id
  +-----+
  | 1 |
  | 2 |
  11 | |
  | 111 |
  +-----+
  4行集(0.00秒)

唯一需要注意的是,显示宽度仅仅影响显示效果,不影响存储,比较,长度计算等等任何操作。

1.2.2字符类型的存储方式

此处主要说明char和varchar的存储方式以及区别。

字符类型是常被称为“定长字符串类型“,它严格限定空间长度,但它限定的是字符数,而非字节数,但以前老版本中限定的是字节数,因此char (M)严格存储M个字符,不足部分使用空格补齐,超出M个字符的部分直接截断。

由于字符类型有“短了就使用空格补足“的能力,因此为了体现数据的真实性,在从地址空间中检索数据时将自动删除尾随的空格部分。这正是字符的一个特殊性,即使是我们手动存储的尾随空格也会被认为是自动补足的,于是在检索时被删除。也就是说在语在句中name=& # 39; gaoxiaofang & # 39;和name=& # 39; gaoxiaofang& # 39;的结果是一样的。

例如:

 create table test2 (char(4)字符集utf8mb4);插入test2值(& # 39;恭喜你& # 39;),(& # 39;恭喜你成功晋级& # 39;),(& # 39;你好# 39;),(& # 39;他& # 39;);选择concat (a & # 39; x # 39;)从test2; + - - - - - - - - - - - - - - - - - - + | concat (a & # 39; x # 39;) |
  + - - - - - - - - - - - - - - - - - - + |恭喜你x |
  | |恭喜你成x
  | hellx |
  |十六进制|
  + - - - - - - - - - - - - - - - - - - + 4行设置

从上面的结果可以看的到,char(4)只能存储4个字符,并删除尾随空格。

varchar常被称为“变长字符串类型“,它存储数据时使用额外的字节的比特位来标记某个字节是否存储了数据。每存储一个字节(不是字符)占用一个比特位进行记录,因此一个额外的字节可以标记共256个字节,2个额外的字节可以标记65536个字节。但MySQL/mariadb限制了最大能存储65536个字节。这表示,如果是单字节的字符,它最多能存储65536个字符,如果是多字节字符,如UTF8的每个字符占用3个字节,它最多能存储65536/3=21845个UTF8字符。

MySQL有哪些数据类型和存储机制原理