2. MySQL 数据类型和存储引擎

发布于:2024-06-04 ⋅ 阅读:(190) ⋅ 点赞:(0)

  • 数据表由多个字段组成,每个字段在进行数据定义的时候都要确定不同的数据类型。MySQL 提供了丰富的数据类型,根据实际需求,用户可以选择不同的数据类型。不同的数据类型,存储方式是不同的。
  • MySQL 还提供了存储引擎,我们可以通过存储引擎决定数据表的类型

【 1. 数据类型 】

1.1 数值类型

1.1.1 整型

  • 整数类型又称 数值型数据 ,主要用来存储数字。
  • 整型的属性字段可以添加 AUTO_INCREMENT 自增约束条件。
类型名称 取值范围 存储字节
位数
TINYINT
很小的整数
-128〜127 1个字节
0 〜255
SMALLINT
小的整数
-32768〜32767 2个宇节
0〜65535
MEDIUMINT
中等大小的整数
-8388608〜8388607 3个字节
0〜16777215
INT (INTEGHR)
普通大小的整数
-2147483648〜2147483647 4个字节
0〜4294967295
BIGINT
大整数
-9223372036854775808〜9223372036854775807 8个字节
0〜18446744073709551615

1.1.2 小数

  • MySQL 中使用浮点数和定点数来表示小数;不论是定点还是浮点类型,如果用户指定的精度 超出精度范围,则会四舍五入处理
    • 浮点类型 有两种,分别是单精度浮点数 FLOAT 和双精度浮点数 DOUBLE;
    • 定点类型 只有一种,就是 DECIMAL。
  • 浮点类型和定点类型都可以用 (M, D) 来表示,其中 M为精度 表示总共的位数; D为标度 表示小数的位数。
    • 浮点数类型的取值范围为 M (1~255) 和 D (1~30,且不能大于 M-2),分别表示显示宽度和小数位数。
      M 和 D 在 FLOAT 和 DOUBLE 中是可选的,在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定)被保存为硬件所支持的最大精度。
    • DECIMAL 的默认M 值为 10、默认D 值为 0,即 (10,0)。
  • 小数数据类型的比较
类型名称 取值范围 存储需求
FLOAT
单精度浮点数
有符号:-3.402823466E+38~-1.175494351E-38。
无符号:0 和 -1.175494351E-38~-3.402823466E+38。
4 个字节
DOUBLE
双精度浮点数
有符号:-1.7976931348623157E+308~-2.2250738585072014E-308。
无符号:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
8 个字节
DECIMAL (M, D),DEC
压缩的“严格”定点数
DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。
如果固定小数的位数D 而 改变总共的位数M,则取值范围将随 M 的变大而变大。
M+2 个字节
DECIMAL 的存储空间并不是固定的,而由精度值 M 决定
  • 浮点数和定点数的优缺点
类型名称 优点 缺点
浮点数 在长度一定的情况下,浮点数能够表示更大的范围 会引起精度问题
两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并 尽量避免做浮点数比较
定点数 定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好 在长度一定的情况下,相对于浮点数,表示的范围小。

1.1.3 数值类型的选择

  • 如果要存储的数字是整数(没有小数部分),则使用整数类型,且值的范围决定了可选用的整数数据类型:
    • 如果取值范围是 0~1000,那么可以选择 SMALLINT~BIGINT 之间的任何一种类型。
    • 如果取值范围超过了 200 万,则不能使用 SMALLINT,可以选择的类型变为从 MEDIUMINT 到 BIGINT 之间的某一种。
    • 当然,完全可以为要存储的值选择一种最“大”的数据类型。但是,如果正确选择数据类型,不仅可以使表的存储空间变小,也会提高性能。因为 与较长的列相比,较短的列的处理速度更快。当读取较短的值时,所需的磁盘读写操作会更少,并且可以把更多的键值放入内存索引缓冲区里
    • 如果无法获知各种可能值的范围,则只能靠猜测,或者使用 BIGINT 以满足最坏情况的需要。如果猜测的类型偏小,那么也不是就无药可救,还可以使用 ALTER TABLE 让该列变得更大些。
  • 如果要存储的数字是小数(带有小数部分),则可以选用 DECIMAL 或浮点类型,但是 一般选择 FLOAT 类型(浮点类型的一种)。

应用

  • 如果数值类型需要存储的数据为货币,如人民币。在计算时,使用到的值常带有元和分两个部分。它们看起来像是浮点值,但 FLOAT 和 DOUBLE 类型都存在四舍五入的误差问题,因此不太适合。因为人们对自己的金钱都很敏感,所以需要一个可以提供完美精度的数据类型。
    可以把货币表示成 DECIMAL(M,2) 类型,其中 M 为所需取值范围的最大宽度。这种类型的数值可以精确到小数点后 2 位。DECIMAL 的优点在于不存在舍入误差,计算是精确的
  • 对于电话号码、信用卡号和社会保险号都会使用非数字字符。因为空格和短划线不能直接存储到数字类型列里,除非去掉其中的非数字字符。但即使去掉了其中的非数字字符,也不能把它们存储成数值类型,以 避免丢失开头的“零”。

1.2 日期和时间

  • 每一个类型都有合法的取值范围,当指定不合法的值时,系统将 值插入数据库中
类型名称 日期格式 日期范围 存储需求
YEAR
YYYY 1901 ~ 2155 1 个字节
TIME
时间
HH:MM:SS -838:59:59 ~ 838:59:59 3 个字节
DATE
日期
YYYY-MM-DD 1000-01-01 ~ 9999-12-3 3 个字节
DATETIME
日期时间
YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8 个字节
TIMESTAMP
时间戳
YYYY-MM-DD HH:MM:SS 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC 4 个字节

YEAR 年

  • YEAR 年 类型是一个单字节类型(在存储时只需要 1 个字节),用于表示年。可以使用各种格式指定 YEAR,如下所示:
    • 以 4 位字符串或者 4 位数字格式表示的 YEAR,输入格式为 ‘YYYY’ 或者 YYYY,范围为 ‘1901’~’2155’。
      例如,输入 ‘2010’ 或 2010,插入数据库的值均为 2010。
    • 以 2 位字符串格式表示的 YEAR,范围为 ‘00’ 到 ‘99’;‘00’~’69’ 和 ‘70’~’99’ 范围的值分别被转换为 2000~2069 和 1970~1999 范围的 YEAR 值。‘0’ 与 ‘00’ 的作用相同。插入超过取值范围的值将被转换为 2000。
    • 以 2 位数字表示的 YEAR,范围为 1~99;1~99 和 70~99 范围的值分别被转换为 2001~2069 和 1970~1999 范围的 YEAR 值。在这里 0 值将被转换为 0000,而不是 2000
  • 两位整数范围与两位字符串范围稍有不同。
    例如,插入 3000 年,读者可能会使用数字格式的 0 表示 YEAR,实际上,插入数据库的值为 0000,而不是所希望的 3000。只有使用字符串格式的 ‘0’ 或 ‘00’,才可以被正确解释为 3000,非法 YEAR值将被转换为 0000。

TIME 时间

  • TIME 类型用于只需要 时间信息 的值,存储时需要 3 个字节,格式为
    • HH 表示小时,MM 表示分钟,SS 表示秒。
HH:MM:SS
  • TIME 类型的取值范围为 -838:59:59~838:59:59,小时部分如此大的原因是 TIME 类型不仅可以用于表示一天的时间(必须小于 24 小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可大于 24 小时,或者甚至为负)。
  • 可以使用各种格式指定 TIME 值,如下所示。
    • 'D HH:MM:SS' 格式的字符串。这里的 D 表示日,可以取 0~34 之间的值,在插入数据库时,D 被转换为小时保存,格式为 “D*24+HH”
      还可以使用这些非严格的语法:'HH:MM:SS''HH:MM''D HH''SS'
    • 'HHMMSS' 没有间隔符的字符串格式 或者 HHMMSS 格式的数值,假定是有意义的时间。
      例如,‘101112’ 被理解为 ‘10:11:12’,但是 ‘106112’ 是不合法的(它有一个没有意义的分钟部分),在存储时将变为 00:00:00。
  • 为 TIME 列分配简写值时应注意:如果没有冒号,MySQL 解释值时,假定最右边的两位表示秒。(MySQL 解释 TIME 值为过去的时间而不是当前的时间)。
    例如,读者可能认为 ‘1112’ 和 1112 表示 11:12:00(即 11 点过 12 分钟),但MySQL 将它们解释为 00:11:12(即 11 分12 秒)。同样 ‘12’ 和 12 被解释为00:00:12。
    相反,TIME 值中如果使用冒号则肯定被看作当天的时间,也就是说,‘11:12’ 表示 11:12:00,而不是 00:11:12。

DATE 日期

  • DATE 类型用于仅需要 日期值 时,没有时间部分,在存储时需要 3 个字节。日期格式为 ‘YYYY-MM-DD’,其中 YYYY 表示年,MM 表示月,DD 表示日。
  • 在给 DATE 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATE 的日期格式即可。如下所示:
    • 'YYYY-MM-DD' 或者 'YYYYMMDD' 字符中格式表示的日期,取值范围为 ‘1000-01-01’~’9999-12-3’。
      例如,输入 ‘2015-12-31’ 或者 ‘20151231’,插入数据库的日期为2015-12-31。
    • 'YY-MM-DD' 或者 'YYMMDD' 字符串格式表示日期,在这里YY表示两位的年值。MySQL 解释两位年值的规则:‘00~69’ 范围的年值转换为 ‘2000~2069’,‘70~99’ 范围的年值转换为 ‘1970~1999’。
      例如,输入 ‘15-12-31’,插入数据库的日期为 2015-12-31;输入 ‘991231’,插入数据库的日期为 1999-12-31。
    • YYMMDD 数字格式表示的日期,与前面相似,00~69 范围的年值转换为 2000~2069,80~99 范围的年值转换为 1980~1999。
      例如,输入 151231,插入数据库的日期为 2015-12-31,输入 991231,插入数据库的日期为 1999-12-31。
    • 使用 CURRENT_DATE 或者 NOW(),插入当前系统日期。
  • MySQL 允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符。
    例如,‘98-11-31’、‘98.11.31’、‘98/11/31’和’98@11@31’ 是等价的,这些值也可以正确地插入数据库。

DATETIME 日期时间

  • DATETIME 类型用于需要 同时包含日期和时间信息 的值,在存储时需要 8 个字节。日期格式为 'YYYY-MM-DD HH:MM:SS',其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒。
  • 在给 DATETIME 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATETIME 的日期格式即可,如下所示。
    • 'YYYY-MM-DD HH:MM:SS' 或者 'YYYYMMDDHHMMSS' 字符串格式表示的日期,取值范围为 ‘1000-01-01 00:00:00’~’9999-12-3 23:59:59’。
      例如,输入 ‘2014-12-31 05:05:05’ 或者 '20141231050505’,插入数据库的 DATETIME 值都为 2014-12-31 05:05:05。
    • 'YY-MM-DD HH:MM:SS' 或者 'YYMMDDHHMMSS' 字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,‘00~79’ 范围的年值转换为 ‘2000~2079’,‘80~99’ 范围的年值转换为 ‘1980~1999’。
      例如,输入 ‘14-12-31 05:05:05’,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
    • YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 数字格式表示的日期和时间。例如,输入 20141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 140505050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
  • MySQL 允许“不严格”语法:任何标点符号都可用作日期部分或时间部分之间的间隔符。
    例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+35’、‘98/12/31 113045’ 和 ‘98@12@31 113045’ 是等价的,这些值都可以正确地插入数据库。

TIMESTAMP 时间戳

  • TIMESTAMP 的显示格式与 DATETIME 相同,显示宽度固定在 19 个字符,日期格式为 YYYY-MM-DD HH:MM:SS,在存储时需要 4 个字节。但是 TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,为 '1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’UTC。在插入数据时,要保证在合法的取值范围内。
  • 协调世界时 (英CUT:Coordinated Universal Time,法TUC:Temps Universel Coordonné)又称为 世界统一时间、世界标准时间、国际协调时间 ,简称 UTC。
  • TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:
    • DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
    • TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区 。即查询时,根据当前时区的不同,显示的时间值是不同的。
  • 如果为一个 DATETIME 或 TIMESTAMP 对象分配一个 DATE 值,结果值的时间部分被设置为 ‘00:00:00’,因此 DATE 值未包含时间信息。
    如果为一个 DATE 对象分配一个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因此DATE 值未包含时间信息。

日期和时间的选择

  • 只记录年份,使用 YEAR 类型;只记录时间,使用 TIME 类型。
  • 如果同时需要记录日期和时间,则可以使用 TIMESTAMP 或者 DATETIME 类型。由于TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,因此存储较大的日期最好使用 DATETIME
  • TIMESTAMP 也有一个 DATETIME 不具备的属性。默认情况下,当插入一条记录但并没有指定 TIMESTAMP 这个列值时,MySQL 会把 TIMESTAMP 列设为当前的时间。因此当需要插入记录和当前时间时,使用 TIMESTAMP 是方便的,另外 TIMESTAMP 在空间上比 DATETIME 更有效。
  • MySQL 没有提供 时间部分为可选的日期类型。DATE 没有时间部分,DATETIME 必须有时间部分 。如果时间部分是可选的,那么可以使用 DATE 列来记录日期,再用一个单独的 TIME 列来记录时间。然后,设置 TIME 列可以为 NULL。SQL 语句如下:
CREATE TABLE mytb1 (
    date DATE NOT NULL,  #日期是必需的
    time TIME NULL  #时间可选(可能为NULL)
);

1.3 文本字符串

  • 字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。
类型名称 说明 存储需求
CHAR(M) 固定长度非二进制字符串 M 字节,1<=M<=255
VARCHAR(M) 变长非二进制字符串 L+1字节,L< = M 且 1<=M<=255
TINYTEXT 非常小的非二进制字符串 L+1字节,L<2^8
TEXT 小的非二进制字符串 L+2字节,L<2^16
MEDIUMTEXT 中等大小的非二进制字符串 L+3字节,L<2^24
LONGTEXT 大的非二进制字符串 L+4字节,L<2^32
ENUM 枚举类型 只能有一个枚举字符串值 1或 2个字节,取决于枚举值的数目 (最大值为65535)
SET 设置 字符串对象可以有零个或 多个SET成员 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)
  • VARCHAR 和 TEXT 类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用 L 表示),而不是取决于类型的最大可能尺寸。
    例如,一个 VARCHAR(10) 列能保存一个最大长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上一个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,而存储要求 5 个字节。

CHAR 固定字符串、VARCHAR 可变字符串

CHAR(M)
固定长度字符串
VARCHAR(M)
可变长度字符串
M的范围 0~255 0~65535
尾部空格 自动删除插入数据的尾部空格 不会删除尾部空格。
处理速度 较快 较慢
存储空间 浪费 节省
  • CHAR(M) 固定长度字符串
    在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。M 表示列的长度,范围是 0~255 个字符。
    例如,CHAR(4) 定义了一个固定长度的字符串列,包含的字符个数最大为 4。
  • VARCHAR(M) 长度可变的字符串
    M 表示最大列的长度,M 的范围是 0~65535。VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,而 实际占用的空间为字符串的实际长度加 1
    例如,VARCHAR(50) 定义了一个最大长度为 50 的字符串,如果插入的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和一个字符串结束字符。VARCHAR 在值保存和检索时尾部的空格仍保留。
  • 存储引擎对于选择 CHAR 和 VARCHAR 的影响:
    • 对于 MyISAM 存储引擎,最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
    • 对于InnoDB存储引擎,最好使用可变长度的数据列,因为 InnoDB 数据表的存储格式不分固定长度和可变长度,因此使用 CHAR 不一定比使用 VARCHAR 更好,但由于 VARCHAR 是按照实际的长度存储,比较节省空间,所以对磁盘 I/O 和数据存储总量比较好。
  • 实例
    下面将不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,说明 CHAR 和 VARCHAR 之间的差别,如下表所示。
    CHAR(4) 定义了固定长度为 4 的列,无论存入的数据长度为多少,所占用的空间均为 4 个字节。VARCHAR(4) 定义的列所占的字节数为实际长度加 1。
    在这里插入图片描述

TEXT 文本

  • TEXT文本 保存非二进制字符串,如文章内容、评论等。
  • 当保存或查询 TEXT 列的值时,不删除尾部空格
  • TEXT 类型分为 4 种:
    • TINYTEXT 表示长度为 255(28-1)字符的 TEXT 列。
    • TEXT 表示长度为 65535(216-1)字符的 TEXT 列。
    • MEDIUMTEXT 表示长度为 16777215(224-1)字符的 TEXT 列。
    • LONGTEXT 表示长度为 4294967295 或 4GB(232-1)字符的 TEXT 列。

ENUM 枚举

  • ENUM枚举 是一个字符串对象,,ENUM 类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个,枚举列表最多可以有 65535 个元素。如果创建的成员中有空格,尾部的空格将自动被删除
    基本语法:
    • 字段名指将要定义的字段,值 n 指枚举列表中第 n 个值。
<字段名> ENUM( '值1', '值1',, '值n' )
  • ENUM 值在内部用整数表示,每个枚举值均有一个索引值,,MySQL 存储的就是这个索引编号;ENUM 值依照列索引顺序排列,并且 空字符串排在非空字符串前,NULL 值排在其他所有枚举值前列表值所允许的成员值从 1 开始编号
  • ENUM 的默认值
    ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULL,NULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。
  • 实例
    定义 ENUM 类型的列(‘first’,‘second’,‘third’),该列可以取的值和每个值的索引如下表所示。
    在这里插入图片描述

SET 集合

  • SET 集合 是一个字符串的对象,可以有零或多个值,SET 列 最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用 逗号, 隔开,当创建表时,SET 成员值的 尾部空格将自动删除
    基本语法:
SET( '值1', '值2',, '值n' )
  • 与 ENUM 类型相同的是,SET 值在内部用整数表示,列表中每个值都有一个索引编号
  • 如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的 值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。

字符串类型的选择

  • 如果需要存储的字符串短于 256 个字符,那么可以使用 CHAR、VARCHAR 或 TINYTEXT。
    如果需要存储更长一点的字符串,则可以选用 VARCHAR 或某种更长的 TEXT 类型。
  • 如果某个字符串列用于表示某种固定集合的值,那么可以考虑使用数据类型 ENUM 或 SET。
    ENUM 和 SET 的值是以字符串形式出现的,但在内部,MySQL 以数值的形式存储它们。
    • ENUM 只能 取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有 65535个成员。因此,在需要从多个值中选取一个时,可以使用 ENUM。
      比如,性别字段适合定义为 ENUM 类型,每次只能从‘男’或‘女’中取一个值。
    • SET 可 取多值。它的合法取值列表最多允许有 64 个成员。空字符串也是一个合法的 SET值。在需要取多个值的时候,适合使用 SET 类型。
      比如,要存储一个人兴趣爱好,最好使用SET类型。

1.4 二进制类型

  • 二进制字符串类型有时候也直接被称为 二进制类型
类型名称 说明 存储需求
BIT(M) 位字段类型 大约 (M+7)/8 字节
BINARY(M) 固定长度二进制字符串 M 字节
VARBINARY (M) 可变长度二进制字符串 M+1 字节
TINYBLOB (M) 非常小的BLOB L+1 字节,L<2^8
BLOB (M) 小 BLOB L+2 字节,在此,L<2^16
MEDIUMBLOB (M) 中等大小的BLOB L+3 字节,L<2^24
LONGBLOB (M) 非常大的BLOB L+4 字节,在此,L<2^32

BIT 位

  • BIT 位 数据类型用来 保存位字段值。M 表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充
    例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入 BIT(4) 类型的字段中的。
    例如,为 BIT(6) 列分配一个值 b’101’,其效果与分配 b’000101’ 相同。
  • 默认情况下,MySQL 不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定的范围内。

BINARY 固定二进制、VARBINARY 可变二进制

  • BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串。
    基本语法:
列名称 BINARY(M) 或者 VARBINARY(M)
  • BINARY 固定二进制 类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充 “\0” 补齐,以达到指定长度。
    例如,指定列数据类型为 BINARY(3),当插入 a 时,存储的内容实际为 “a\0\0”,当插入 ab 时,实际存储的内容为“ab\0”,无论存储的内容是否达到指定的长度,存储空间均为指定的值 M。
  • VARBINARY 可变二进制 类型的长度是可变的,指定好长度之后,长度可以在 0 到最大值之间。
    例如,指定列数据类型为 VARBINARY(20),如果插入的值长度只有 10,则实际存储空间为 10 加 1,实际占用的空间为字符串的实际长度加 1。

BLOB 二进制大对象

  • BLOB (binary large object),二进制大对象 用来存储可变数量的数据。
数据类型 存储范围
TINYBLOB 最大长度为255 (28-1)字节
BLOB 最大长度为65535 (216-1)字节
MEDIUMBLOB 最大长度为16777215 (224-1)字节
LONGBLOB 最大长度为4294967295或4GB (231-1)字节
BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。
  • BLOB 和 TEXT 的对比,两者均可存放大容量的信息。
BLOB TEXT
存储的类型 二进制字符串(字节字符串) 非进制字符串(字符字符串)
排序和比较的规则 基于列值字节的数值 根据字符集对值进行排序和比较。
用于存储的信息 主要存储图片、音频信息等 只能存储纯文本文件。

1.5 转义字符

  • 转义字符 一般以反斜杠符号\开头,用来说明后面的字符不是字符本身的含义,而是表示其它的含义。
转义字符 转义后的字符
" 双引号(")
单引号(')
\ 反斜线(\)
\n 换行符
\r 回车符
\t 制表符
\0 ASCII 0(NUL)
\b 退格符
  • 转义字符区分大小写
    例如:‘\b’ 解释为退格,但 ‘\B’ 解释为 ‘B’。

  • 字符串用双引号"引用时,该字符串中的单引号 '不需要特殊对待,且不必被重复转义。
    字符串用单引号’引用时,该字符串中的双引号"不需要特殊对待,且不必被重复转义。

  • 字符串的内容包含一个单引号’时,可以用两个单引号'' 或 反斜杠+单引号\' 来表示。
    字符串的内容包含一个双引号"时,可以用两个双引号"" 或 反斜杠+双引号\' 来表示。

  • 把二进制数据插入到一个 BLOB 列,下列字符必须使用反斜杠\转义:

    • NUL:ASCII 0,可以使用“\0“表示。
    • \:ASCII 92,反斜线,用“\”表示。
    • ’ :ASCII 39,单引号,用“'”表示。
    • " :ASCII 34,双引号,用“"”表示。
  • 实例
    SELECT '普罗米修斯', '"普罗米修斯"','""普罗米修斯""','普罗米''修斯', '\'普罗米修斯';
    在这里插入图片描述
    SELECT "普罗米修斯 ", "'普罗米修斯'", "''普罗米修斯''", "普罗米""修斯", "\"普罗米修斯";
    在这里插入图片描述
    SELECT "这\n是\n普罗米\n修斯";
    在这里插入图片描述

【 2. 存储引擎 】

  • 数据库存储引擎 是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。简而言之,存储引擎就是指表的类型 。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
  • MySQL 的核心就是存储引擎。MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎
存储引擎 描述
ARCHIVE 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
CSV 在存储数据时,会以逗号作为数据项之间的分隔符。
BLACKHOLE 会丢弃写操作,该操作会返回空内容。
FEDERATED 将数据存储在远程数据库中,用来访问远程表的存储引擎。
InnoDB 具备外键支持功能的事务处理引擎
MEMORY 置于内存的表
MERGE 用来管理由多个 MyISAM 表构成的表集合
MyISAM 主要的非事务处理存储引擎
NDB MySQL 集群专用存储引擎
  • 可以使用SHOW ENGINES;语句查看系统所支持的引擎类型:
    • Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,
    • DEFAULT表示该引擎为当前默认的存储引擎。
      在这里插入图片描述

2.1 查看和修改默认存储引擎

  • 查看默认的存储引擎
    SHOW VARIABLES LIKE 'default_storage_engine%';
    在这里插入图片描述执行结果显示,InnoDB 存储引擎为默认存储引擎。

  • 修改数据库临时的默认存储引擎:
    SET default_storage_engine=< 存储引擎名 >

  • 实例
    将 MySQL 数据库的临时默认存储引擎修改为 MyISAM:
    在这里插入图片描述
    此时,可以发现 MySQL 的默认存储引擎已经变成了 MyISAM。但是当再次重启客户端时,默认存储引擎仍然是 InnoDB。

2.2 查看数据表的存储引擎

  • 基本语法
    SHOW CREATE TABLE 你的数据表表名
  • 实例
    查看 student 表当前的存储引擎。可以看到,student 表当前的存储引擎为 InnoDB。
    在这里插入图片描述

2.3 修改数据表的存储引擎

  • 基本语法:
    • ENGINE 关键字用来指明新的存储引擎。
ALTER TABLE <表名> ENGINE=<存储引擎名>;
  • 实例
    将 student 表的存储引擎修改为 MyISAM 类型。
    ALTER TABLE student ENGINE=MyISAM;
    在这里插入图片描述

2.4 如何选择MySQL存储引擎

特性 MyISAM InnoDB MEMORY
存储限制 支持
事务安全 不支持 支持 不支持
锁机制 表锁 行锁 表锁
B树索引 支持 支持 支持
哈希索引 不支持 不支持 支持
全文索引 支持 不支持 不支持
集群索引 不支持 支持 不支持
数据缓存 支持 支持
索引缓存 支持 支持 支持
数据可压缩 支持 不支持 不支持
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 不支持 支持 不支持
  • MyISAM 存储引擎 不支持事务和外键,所以访问速度比较快。如果应用主要以读取和写入为主,只有少量的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择 MyISAM 存储引擎是非常适合的。

  • InnoDB 存储引擎事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比 MyISAM 存储引擎 占用更多的磁盘空间
    如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。
    InnoDB 存储引擎除了可以有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB 都是合适的选择。

  • MEMORY 存储引擎 将所有数据保存在 RAM 中,所以该存储引擎的数据访问速度快,但是 安全上没有保障
    MEMORY 对表的大小有限制,太大的表无法缓存在内存中。由于使用 MEMORY 存储引擎没有安全保障,所以要确保数据库异常终止后表中的数据可以恢复。如果应用中涉及 数据比较少,且需要进行 快速访问,则适合使用 MEMORY 存储引擎。


网站公告

今日签到

点亮在社区的每一天
去签到