Mysql5.7 基本数据类型全解析

  • 数据类型描述使用以下约定:
    - 对于整数类型,M 表示最大显示宽度。对于浮点和定点类型, M 是可以存储的总位数(精度)。
    - 对于字符串类型, M 是最大长度。 M 的最大允许值取决于数据类型。
    - D 适用于浮点和定点类型,并 表示小数点后的位数(小数位数)。可能的最大值为 30,但不应大于 M -2.



数值类型

语法

  • 对于整数数据类型,* M *table 示最大显示宽度。最大显示宽度为 255.显示宽度与类型可以存储的值的范围无关
  • 对于浮点和定点数据类型,* M *是可存储的总位数。
  • 允许UNSIGNED属性的数值数据类型也允许SIGNED。但是,这些数据类型默认情况下是带符号的,因此SIGNED属性无效。



整数类型(精确值) TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT

存储空间和范围

在这里插入图片描述




定点类型(精确值)DECIMAL,NUMERIC

  • DECIMAL和NUMERIC类型存储精确的数字数据值。当保留精确度很重要时,例如使用货币数据,则可以使用这些类型。
  • 在DECIMAL列声明中,可以(通常是)指定精度和小数位数
salary DECIMAL(5,2)
  • 如果小数位数为 0,则DECIMAL值不包含小数点或小数部分。



浮点类型(近似值)FLOAT,DOUBLE

  • FLOAT和DOUBLE类型 table 示近似数字数据值。 MySQL 将四个字节用于单精度值,并将八个字节用于双精度值。
  • MySQL 在存储值时执行舍入,因此,如果将999.00009插入FLOAT(7,4)列,则近似结果为999.0001。
  • 由于浮点值是近似值而不是作为精确值存储的,因此在比较中尝试将它们视为精确值可能会导致问题。它们还受平台或实现依赖性的约束。

位值类型 BIT

  • BIT数据类型用于存储位值。 BIT(M)类型可以存储* M *位值。 * M *的范围是 1 到 64.
  • 如果您为长度小于* M *的BIT(M)列分配一个值,则该值将在左侧填充零。例如,将b’101’的值分配给BIT(6)列实际上与分配b’000101’相同。



超出范围和溢出处理

  • 当 MySQL 在数值列中存储的值超出列数据类型的允许范围时,结果取决于当时有效的 SQL 模式:
    • 如果启用了严格的 SQL 模式,则按照 SQL 标准,MySQL 会拒绝超出范围的值并产生错误,并且插入将失败。
    • 如果未启用任何限制模式,MySQL 会将值裁剪到列数据类型范围的适当端点,并存储结果值。
      在这里插入图片描述



日期和时间类型

  • DATE,TIME,DATETIME,TIMESTAMP和YEAR。
  • 每个时间类型都有一个有效值范围,以及一个“零”值,当您指定 MySQL 无法代 table 的无效值时可以使用该值。
  • TIMESTAMP和DATETIME类型具有特殊的自动更新行为
  • 默认情况下,当 MySQL 遇到日期或时间类型的值超出范围或对该类型无效时,它将将该值转换为该类型的“零”值
    exception 是超出范围的TIME值被裁剪到TIME范围的适当端点。

在这里插入图片描述

DATE

  • 支持的范围是’1000-01-01’到’9999-12-31’

DATETIME

  • 支持的范围是’1000-01-01 00:00:00.000000’到’9999-12-31 23:59:59.999999’。
  • MySQL 以’YYYY-MM-DD hh:mm:ss[.fraction]'格式显示DATETIME值,但允许使用字符串或数字将值分配给DATETIME列。
  • 可以指定一个介于 0 到 6 之间的* fsp *值,以指定小数秒精度。值为 0table 示没有小数部分。如果省略,则默认精度为 0.
  • TIMESTAMP值存储为从纪元(‘1970-01-01 00:00:00’ UTC)起的秒数。
  • TIMESTAMP不能 table 示值’1970-01-01 00:00:00’,因为它等于从纪元开始的 0 秒,并且保留值 0 来 table 示’0000-00-00 00:00:00’(“零” TIMESTAMP值)。

TIME

  • 一次范围是’-838:59:59.000000’至’838:59:59.000000’。

  • MySQL 以’hh:mm:ss[.fraction]'格式显示TIME值,但允许使用字符串或数字将值分配给TIME列。

  • 可以指定一个介于 0 到 6 之间的* fsp *值,以指定小数秒精度。值为 0table 示没有小数部分。如果省略,则默认精度为 0.

TIMESTAMP

  • 范围是’1970-01-01 00:00:01.000000’ UTC 到’2038-01-19 03:14:07.999999’ UTC。

YEAR

  • 4 位数字格式的年份。 MySQL 以YYYY *格式显示YEAR个值,但允许使用字符串或数字将值分配给YEAR列。
  • 值显示为1901至2155或0000。



字符串类型

  • 字符串数据类型为CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM和SET

语法

对于字符串列(CHAR,VARCHAR和TEXT类型)的定义,MySQL 以字符单位解释长度规范。对于二进制字符串列(BINARY,VARBINARY和BLOB类型)的定义,MySQL 以字节为单位解释长度规范

CHAR

  • 一个固定长度的字符串,在存储时总是用空格填充到指定的长度。 * M *table 示以字符为单位的列长。 * M 的范围是 0 到 255.如果省略 M *,则长度是 1.
  • MySQL 允许您创建CHAR(0)类型的列.只能包含值NULL和’’(空字符串)

VARCHAR

  • 可变长度的字符串。 * M *table 示最大列长度,以字符为单位。 * M *的范围是 0 到 65,535.
  • MySQL 将VARCHAR值存储为 1 字节或 2 字节长的前缀以及数据。长度前缀指示值中的字节数。如果值要求不超过 255 个字节,则VARCHAR列使用一个长度字节;如果值可能需要不超过 255 个字节,则VARCHAR列使用两个长度字节。

BINARY

  • BINARY类型类似于CHAR类型,但是存储二进制字节字符串而不是非二进制字符串。可选长度* M table 示以字节为单位的列长度。如果省略,则 M *默认为 1.

VARBINARY

  • VARBINARY类型类似于VARCHAR类型,但是存储二进制字节字符串而不是非二进制字符串。 * M *table 示最大列长度(以字节为单位)。

CHAR 和 VARCHAR 类型

  • CHAR和VARCHAR类型相似,但是它们的存储和检索方式不同。它们的最大长度以及是否保留尾随空格也不同。
  • 声明CHAR和VARCHAR类型的长度,该长度指示您要存储的最大字符数。例如,CHAR(30)最多可容纳 30 个字符。
  • 检索CHAR值时,除非启用了PAD_CHAR_TO_FULL_LENGTH SQL 模式,否则删除尾随空格。
  • VARCHAR值在存储时不会填充。根据标准 SQL,在存储和检索值时保留尾随空格。

在这里插入图片描述

BINARY 和 VARBINARY 类型

  • BINARY和VARBINARY类型与CHAR和VARCHAR类似,除了它们存储二进制字符串而不是非二进制字符串。即,它们存储字节字符串而不是字符串。
  • 存储BINARY个值时,将使用填充值将其右填充到指定的长度。填充值为0x00(零字节)。值用0x00右填充以进行插入,并且不删除尾随字节以进行检索
  • 示例:对于BINARY(3)列,插入时’a ‘变为’a \0’。插入时,‘a\0’变为’a\0\0’。两个插入的值均保持不变以进行检索。
  • 对于VARBINARY,插入没有填充,也没有剥离任何字节以进行检索。所有字节在比较中都是有效的,包括ORDER BY和DISTINCT操作。

BLOB 和 TEXT 类型

  • TINYBLOB,BLOB,MEDIUMBLOB和LONGBLOB
  • TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT
  • BLOB值被视为二进制字符串(字节字符串),TEXT值被视为非二进制字符串(字符字符串)。。四种TEXT类型对应四种BLOB类型,并且具有相同的最大长度和存储要求。
  • 对于TEXT和BLOB列,插入时没有填充,选择时也不会删除字节。
  • 对于BLOB和TEXT列上的索引,必须指定索引前缀长度。对于CHAR和VARCHAR,前缀长度是可选的
  • BLOB和TEXT列不能具有DEFAULT值

ENUM类型

SET类型

  • 定义中的重复值会导致警告,如果启用了严格的 SQL 模式,则会导致错误。



空间数据类型




JSON数据类型




数据类型默认值

  • 不能为BLOB,TEXT,GEOMETRY和JSON数据类型分配默认值。
  • 如果在定义列时没有显式指定默认值(DEFAULT value),MySQL 将按以下方式设置默认值
  • 如果该列可以使用NULL作为值,则使用显式DEFAULT NULL子句定义该列
  • 如果该列不能使用NULL作为值,则 MySQL 定义该列时不带显式DEFAULT子句。

插入更新规则

为了将数据 Importing 到没有显式DEFAULT子句的NOT NULL列中,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将列设置为NULL,则 MySQL 将根据有效的 SQL 模式处理该列。

  • 严格模式
    - 事务 table 将发生错误,并且该语句将回滚。
    - 对于非事务 table,会发生错误,但是如果此错误发生在多行语句的第二行或后续行中,则会插入前面的行。
  • 非严格模式
    - MySQL 将列设置为列数据类型的隐式默认值。

隐式默认值

  • 对于数字类型,默认值为0,但对于使用AUTO_INCREMENT属性声明的整数或浮点类型,默认值为序列中的下一个值。
  • 对于TIMESTAMP以外的日期和时间类型,默认值为该类型的适当“零”值。
  • 对于ENUM以外的其他字符串类型,默认值为空字符串。对于ENUM,默认值为第一个枚举值。



数据类型存储大小

  • table 的内部 table 示形式的最大行大小为 65,535 字节,即使存储引擎能够支持更大的行也是如此

数字类型存储要求

在这里插入图片描述

日期和时间类型存储要求

在这里插入图片描述

字符串类型存储要求

在这里插入图片描述

  • 要计算用于存储特定的CHAR,VARCHAR或TEXT列值的字节数,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是在使用utf8 Unicode 字符集时,必须记住,并非所有字符都使用相同数量的字节。 utf8mb3和utf8mb4字符集每个字符分别最多需要三个和四个字节

使用其他数据库引擎中的数据类型

在这里插入图片描述




参考链接

Mysql 官网
Mysql 5.7 中文文档
深入浅出MySQL:数据库开发、优化与管理维护(第2版)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值