MySQL 数据类型和搜索引擎

文章目录

  • 【 1. 数据类型 】
    • 1.1 数值类型
      • 1.1.1 整型
      • 1.1.2 小数
      • 1.1.3 数值类型的选择
    • 1.2 日期和时间
      • YEAR 年
      • TIME 时间
      • DATE 日期
      • DATETIME 日期时间
      • TIMESTAMP 时间戳
      • 日期和时间的选择
    • 1.3 文本字符串
      • CHAR 固定字符串、VARCHAR 可变字符串
      • TEXT 文本
      • ENUM 枚举
      • SET 集合
      • 字符串类型的选择
    • 1.4 二进制类型
      • BIT 位
      • BINARY 固定二进制、VARBINARY 可变二进制
      • BLOB 二进制大对象
    • 1.5 转义字符
  • 【 2. 存储引擎 】
    • 2.1 查看和修改默认存储引擎
    • 2.2 查看数据表的存储引擎
    • 2.3 修改数据表的存储引擎
    • 2.4 如何选择MySQL存储引擎

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

【 1. 数据类型 】

1.1 数值类型

1.1.1 整型

  • 整数类型又称 数值型数据 ,主要用来存储数字。
  • 整型的属性字段可以添加 AUTO_INCREMENT 自增约束条件。
类型名称取值范围存储字节
位数
TINYINT
很小的整数
-128〜1271个字节
0 〜255
SMALLINT
小的整数
-32768〜327672个宇节
0〜65535
MEDIUMINT
中等大小的整数
-8388608〜83886073个字节
0〜16777215
INT (INTEGHR)
普通大小的整数
-2147483648〜21474836474个字节
0〜4294967295
BIGINT
大整数
-9223372036854775808〜92233720368547758078个字节
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 决定。
如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。
M+2 个字节
DECIMAL 的存储空间并不是固定的,而由精度值 M 决定
  • 浮点数和顶点数的优缺点
    • 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题
    • 在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好 ,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并 尽量避免做浮点数比较

1.1.3 数值类型的选择

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

应用

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

1.2 日期和时间

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

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

SET 集合

  • SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用 逗号, 隔开,语法格式如下:
SET( '值1', '值2',, '值n' )
  • 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除
  • 但与 ENUM 类型不同的是,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)非常小的BLOBL+1 字节,L<2^8
BLOB (M)小 BLOBL+2 字节,在此,L<2^16
MEDIUMBLOB (M)中等大小的BLOBL+3 字节,L<2^24
LONGBLOB (M)非常大的BLOBL+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 的对比
    两者均可存放大容量的信息。
BLOBTEXT
存储的类型二进制字符串(字节字符串)非进制字符串(字符字符串)
排序和比较的规则基于列值字节的数值根据字符集对值进行排序和比较。
用于存储的信息主要存储图片、音频信息等只能存储纯文本文件。

1.5 转义字符

  • 转义字符一般以反斜杠符号\开头,用来说明后面的字符不是字符本身的含义,而是表示其它的含义。
转义字符转义后的字符
"双引号(")
单引号(')
\反斜线(\)
\n换行符
\r回车符
\t制表符
\0ASCII 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 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎
  • 可以使用SHOW ENGINES;语句查看系统所支持的引擎类型:
    • Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,
    • DEFAULT表示该引擎为当前默认的存储引擎。
      在这里插入图片描述
存储引擎描述
ARCHIVE用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
CSV在存储数据时,会以逗号作为数据项之间的分隔符。
BLACKHOLE会丢弃写操作,该操作会返回空内容。
FEDERATED将数据存储在远程数据库中,用来访问远程表的存储引擎。
InnoDB具备外键支持功能的事务处理引擎
MEMORY置于内存的表
MERGE用来管理由多个 MyISAM 表构成的表集合
MyISAM主要的非事务处理存储引擎
NDBMySQL 集群专用存储引擎

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存储引擎

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

假如有几十个请求,如何去控制高并发?

公司项目中做图片或文件批量下载&#xff0c;每次下载都是大批量的&#xff0c;那么假如我一次性下载几十个&#xff0c;如何去控制并发请求的&#xff1f; 让我想想&#xff0c;额~&#xff0c; 选中ID&#xff0c;循环请求&#xff1f;&#xff0c;八嘎&#xff01;肯定不是那…

MySQL中Undo-log是什么?有什么作用?

2.6.1. Undo-log撤销日志 Undo即撤销的意思&#xff0c;通常也称为回滚日志&#xff0c;用来给MySQL撤销SQL操作的。 当一条写入类型的SQL执行时&#xff0c;都会记录Undo-log日志&#xff0c;Undo-log并不存在单独的日志文件&#xff0c;InnoDB默认是将Undo-log存储在xx.ibd…

利用基于CNN的人员检测与关键词识别的TinyML实现无接触电梯

目录 说明 论文概述 摘要 引言 现有非接触式电梯解决方案 新解决方案的需求 tinyML实施 系统构建和算法管道 CNN和TinyML实现 结果与讨论 结论 视频演示和代码可用性 一点感想 说明 我一直使用Google Schloar订阅最新的论文消息&#xff0c;今天看到一篇论文的标…

H6246 60V降压3.3V稳压芯片 60V降压5V稳压芯片IC 60V降压12V稳压芯片

H6246降压稳压芯片是一款电源管理芯片&#xff0c;为高压输入、低压输出的应用设计。以下是对该产品的详细分析&#xff1a; 一、产品优势 宽电压输入范围&#xff1a;H6246支持8V至48V的宽电压输入范围&#xff0c;使其能够适应多种不同的电源环境&#xff0c;增强了产品的通用…

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能&#xff0c;本身应该是一个很简单的功能&#xff0c;却发生了意向不到的问题…让我们看下&#xff1a; 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转&#xff0c;我这边为了方便首选肯定是考虑用response.sendRedirect(url)&#xff0c;但是做好…

基于朴素贝叶斯算法的微博舆情监控系统,flask后端,可视化丰富

背景&#xff1a; 微博作为中国最大的社交媒体平台之一&#xff0c;汇聚了海量用户生成的文本数据&#xff0c;承载着丰富的社会信息和舆论动向。随着互联网的快速发展&#xff0c;人们对于利用这些数据进行舆情分析和预测的需求日益增加。在这种情况下&#xff0c;以Python为…

Sui新共识协议刷新了区块链交易速度的标准

Sui是提供业界领先性能和无限水平扩展的创新Layer 1区块链&#xff0c;今日在官推上宣布其最新共识协议Mysticeti已成功部署到测试网。这一重大突破将Sui测试网的共识时间减少了80%&#xff0c;至390毫秒&#xff0c;同时保持协议的行业领先吞吐量。这一令人印象深刻的演示证明…

2024「618年中盛典」媒体邀约有哪些优惠活动?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 51媒体网2024年618 活动正式开启&#xff0c;也预示着2024传播季—年中盛典的到来&#xff0c;从即日起下单的客户&#xff0c;即可享受满减增等优惠政策&#xff0c;新客更享受折上折的…

Clickhouse Bitmap 类型操作总结—— Clickhouse 基础篇(四)

文章目录 创建 Bitmap 对象Bitmap 转换为整数数组计算总数&#xff08;去重&#xff09;值指定start, end 索引生成子 Bitmap指定 start 索引和数量限制生成子 Bitmap指定偏移量生成子 Bitmap是否包含指定元素两个 Bitmap 是否存在相同元素一个是否为另一个 Bitmap 的子集求最小…

P7-P9【分配器】【源文件】【OOPvs.GP】

分配器 如何分配&#xff0c;如何释放 源文件 标准库源代码文件VC布局 标准库源代码文件GCC布局 OOP(面向对象编程) VS GP(泛型编程) 这两种编程的区别&#xff1a; 面向对象编程是将数据和方法联系在一起&#xff0c;更注重对不同的对象做出不同的响应&#xff0c;更适合…

狂暴少帅短视频:成都科成博通文化传媒公司

狂暴少帅短视频&#xff1a;热血与激情的碰撞 在当下这个信息爆炸的时代&#xff0c;短视频以其独特的魅力迅速占领了人们的视线。而在众多短视频创作者中&#xff0c;一位名为“狂暴少帅”的创作者以其独特的风格和引人入胜的内容&#xff0c;赢得了广大网友的喜爱和追捧。今…

OpenHarmony应用开启Service以及完成自启动和常驻

一.背景 由于有需求实现一个后台常驻服务,这里就是来实现在鸿蒙里面如何实现后台服务并且实现自启动和常驻 二.添加服务 如下来添加服务 然后此时直接运行这个hap是报错的,如下: 此处参考: 应用中添加ServiceExtensionAbility然后安装HAP时提示“code:9568344 error: inst…

SSH秘钥对简化github项目管理(外加Tortoise配置)

文章目录 使用SSH秘钥对简化github项目管理为什么要用密钥对&#xff1f;如何使用SSH方式克隆版本库呢&#xff1f;补充&#xff1a;使用TortoiseGit&#xff08;小乌龟&#xff09;快速访问github远程仓库&#xff01;结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 使用SSH秘…

人才测评的应用:人才选拔,岗位晋升,面试招聘测评

人才测评自诞生以来&#xff0c;就被广泛应用在各大方面&#xff0c;不仅是我们熟悉的招聘上&#xff0c;还有其他考核和晋升&#xff0c;都会需要用到人才测评。不知道怎么招聘&#xff1f;或者不懂得如何实现人才晋升&#xff1f;都可以参考人才测评&#xff0c;利用它帮我们…

AI视频教程下载:零基础学会DALL-E 、Midjourney、Microsoft Designer、Adobe Firefly

学完本课程会得到什么&#xff1a; 掌握ChatGPT、DALL-E 2、Midjourney、Microsoft Bing Chat、Microsoft Designer和Adobe Firefly&#xff0c;全面理解生成性AI及其应用 了解OpenAI及其在生成性AI领域的尖端研究 理解提示工程的重要性以及它如何帮助产生更好的输出和数据 …

Llama模型家族训练奖励模型Reward Model技术及代码实战(一)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

2024最新升级Stable Diffusion整合包v4.6版来了,附赠SD电商实战教程

Stable Diffusion无疑是最近最火的AI绘画工具之一&#xff0c;本期设计软件库给大家带来了2024最新升级的v4.6版&#xff01;比之前推送的更加智能、快速和简单 2024全新Stable Diffusion 资料包 新版本使用更方便 独家附赠SD电商实战教程 让你快速上手 资源目录一览 01 新…

Git——pull request详细教程

当我们需要协助其他仓库完成更改时&#xff0c;往往会用到git中的Pull Request操作&#xff0c;从而方便团队的协作管理和代码持续集成。 下面是详细的教程步骤。 一. Fork目标项目 比如说我现在要fork以下Qwen-VL的项目&#xff0c;如图所示&#xff1a; 随后点击Create即可…

PENDLE会是打响LSDFI赛道的第一枪吗?以bitget钱包为例

Pendle Finance是什么? PENDLE是Pendle Finance的原生通证&#xff0c;因此&#xff0c;在介绍Pendle币之前&#xff0c;我们需要对Pendle Finance有一个简单的了解。、 Pendle是一个建立在以太坊区块链上的无需许可的去中心化金融&#xff08;DeFi&#xff09;协议&#xff…