MySQL: 3.MySQL数据类型

时间秒杀一切 提交于 2020-02-13 02:04:05

MySQL数据类型

一、MySQL数据类型简介

在设计表时,应该特别重视数据列所用的数据类型,如果使用错误的数据类型可能会严重影响应用程序的功能和性能。

更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。

MySQL 的数据类型有大概可以分为5种,分别是整数类型、浮点数类型和定点数类型、日期和时间类型、字符串类型、二进制类型等。

注意:整数类型和浮点数类型可以统称为数值数据类型。

  1. 数值类型
    整数类型包括TINYINTSMALLINTMEDIUMINTINTBIGINT,浮点数类型包括FLOATDOUBLE,定点数类型为DECIMAL
  2. 日期/时间类型
    包括YEARTIMEDATEDATETIMETIMESTAMP
  3. 字符串类型
    包括CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET等。
  4. 二进制类型
    包括BITBINARYVARBINARYTINYBLOBBLOBMEDIUMBLOBLONGBLOB

说明:

  • 关键字INTINTEGER的同义词,关键字DECDECIMAL的同义词。
  • BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
  • 作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。

二、数值类型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1字节 (-128, 127) (0, 255) 小整数值
SMALLINT 2字节 (-32768, 32767) (0, 65535) 大整数值
MEDIUMINT 3字节 (-8388608, 8388607) (0, 16777215) 大整数值
INT
INTEGER
4字节 (-2147483648, 2147483647) (0, 4294967295) 大整数值
BIGINT 8字节 (-9223372036854775808, 9223372036854775807) (0, 18446744073709551615) 极大整数值
FLOAT 4字节 (-3.402823466E+38, -1.175494351E-38),
0,
(1.175494351E-38, 3.402823466351E+38)
0,
(1.175494351E-38, 3.402823466E+38)
单精度浮点数值
DOUBLE 8字节 (-1.7976931348623157E+308, -2.2250738585072014E-308),
0,
(2.2250738585072014E-308, 1.7976931348623157E+308)
0,
(2.2250738585072014E-308, 1.7976931348623157E+308)
双精度浮点数值
DECIMAL M+2 依赖于MD的值 依赖于MD的值 小数值

1.整数类型

MySQL 主要提供的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加AUTO_INCREMENT自增约束条件。下表中列出了MySQL中的数值类型。

类型名称 说明 存储需求
TINYINT 很小的整数 1个字节
SMALLINT 小的整数 2个宇节
MEDIUMINT 中等大小的整数 3个字节
INT (INTEGHR) 普通大小的整数 4个字节
BIGINT 大整数 8个字节

各类型数值范围:

类型名称 范围(有符号) 范围(无符号)
TINYINT -128~127 0 ~255
SMALLINT -32768~32767 0~65535
MEDIUMINT -8388608~8388607 0~16777215
INT (INTEGER) -2147483648~2147483647 0~4294967295
BIGINT -9223372036854775808~9223372036854775807 0~18446744073709551615

整型数据类型也可以在定义表结构时指定所需的显示宽度,如INT(10),如果不指定,则系统为每一种类型指定默认的宽度值。
显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充。如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来

2.小数类型

MySQL中使用浮点数和定点数来表示小数。

浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是DECIMAL

类型名称 说明 存储需求 精确度
FLOAT 单精度浮点数 4 个字节 大约精确到7位小数位
(整数部分加上小数部分的位数是7,不是单指小数位数)
DOUBLE 双精度浮点数 8 个字节 大约精确到15位小数位
DECIMAL(M, D), DEC 压缩的“严格”定点数 M+2 个字节 (M,D)决定
类型名称 取值范围(有符号) 取值范围(无符号)
FLOAT -3.402823466E+38~-1.175494351E-38 0,
-1.175494351E-38~-3.402823466E+38
DOUBLE -1.7976931348623157E+308~-2.2250738585072014E-308 0,
-2.2250738585072014E-308~-1.7976931348623157E+308
DECIMAL(M, D), DEC (M,D)决定 (M,D)决定

浮点类型和定点类型都可以用(M, D)来表示,其中M称为精度,表示总共的位数,范围为1~255D称为标度,表示小数的位数,范围为0~30,其中必须满足M>=D。注意这里的位数是十进制的位数,而且这个位数不包括符号和小数点,因为定点数DECIMAL在存储的时候实际是以字符串的方式存储的(就像Excel中存储身份证号或者手机号的时候前面加个单引号的效果一样)。比如DECIMAL(5,2)能够存储的范围为:-999.99~999.99

一个ASCII字符占1个字节,符号和小数点各为一个字符,因此DECIMAL总共占M+2字节。

一些精度要求比较高的数字如金额、身份证号、科学数据等存储的时候最好用DECIMAL来存储,另外浮点数在进行运算和比较的时候也容易出问题。

存储的时候如果超出数值范围会报错(有时候FLOATDOUBLE不会报错,会直接取范围内最接近的值),如果在数值范围内但是小数部分长度超出范围会四舍五入,即使是DECIMAL小数部分超长了也会四舍五入。比如DECIMAL(5,2),范围为:-999.99~999.99,如果数字大于最大值或者小于最小值的话会报错,比如999.991或者1000.00;如果输入999.9556的话,会变成999.96

FLOATDOUBLE在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),但最好能根据业务情况指定一下精度。DECIMAL如果不指定精度,默认为(10,0)

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围,节省空间;缺点是会引起精度问题。

最后再强调一下:在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用DECIMAL的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

例子

mysql> CREATE TABLE `numbertest`(`float` FLOAT, `float12_6` FLOAT(12,6), `double` DOUBLE, `double20_15` DOUBLE(20,15), `decimal20_15` DECIMAL(20,15));
Query OK, 0 rows affected (0.04 sec)


mysql> DESC `numbertest`;
+--------------+----------------+------+-----+---------+-------+
| Field        | Type           | Null | Key | Default | Extra |
+--------------+----------------+------+-----+---------+-------+
| float        | float          | YES  |     | NULL    |       |
| float12_6    | float(12,6)    | YES  |     | NULL    |       |
| double       | double         | YES  |     | NULL    |       |
| double20_15  | double(20,15)  | YES  |     | NULL    |       |
| decimal20_15 | decimal(20,15) | YES  |     | NULL    |       |
+--------------+----------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


mysql> INSERT INTO `numbertest` VALUES(
    -> 12345.67891011121314151617, 12345.67891011121314151617, 12345.67891011121314151617, 12345.67891011121314151617, 12345.67891011121314151617
    -> );
Query OK, 1 row affected, 1 warning (0.00 sec)


mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------------+
| Level | Code | Message                                           |
+-------+------+---------------------------------------------------+
| Note  | 1265 | Data truncated for column 'decimal20_15' at row 1 |
+-------+------+---------------------------------------------------+
1 row in set (0.00 sec)


mysql> SELECT * FROM `numbertest`;
+---------+--------------+--------------------+-----------------------+-----------------------+
| float   | float12_6    | double             | double20_15           | decimal20_15          |
+---------+--------------+--------------------+-----------------------+-----------------------+
| 12345.7 | 12345.678711 | 12345.678910111214 | 12345.678910111214000 | 12345.678910111213142 |
+---------+--------------+--------------------+-----------------------+-----------------------+
1 row in set (0.00 sec)

三、日期和时间类型

下表中列出了 MySQL 中的日期与时间类型。

类型名称 日期格式 日期范围 存储需求
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 1970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC
结束时间是第2147483647秒,北京时间2038-1-19 11:14:07,格林尼治时间2038年1月19日 凌晨 03:14:07
4 个字节

YEAR类型

YEAR 类型是一个单字节类型,用于表示年,在存储时只需要 1 个字节。可以使用各种格式指定 YEAR,如下所示:

  • 以 4 位字符串或者 4 位数字格式表示的 YEAR,范围为 ‘1901’~’2155’。输入格式为 ‘YYYY’ 或者 YYYY,例如,输入 ‘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’ 格式的字符串。还可以使用这些“非严格”的语法:‘HH:MM:SS’、‘HH:MM’、‘D HH’ 或 ‘SS’。这里的 D 表示日,可以取 0~34 之间的值。在插入数据库时,D 被转换为小时保存,格式为 “D*24+HH”。
  • ‘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’ 范围的年值转换为 ‘20002069’,'7099’ 范围的年值转换为 ‘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:00 UTC ~ 2038-01-19 03:14:07 UTC。在插入数据时,要保证在合法的取值范围内。

提示:协调世界时(英:Coordinated Universal Time,法:Temps Universel Coordonné)又称为世界统一时间、世界标准时间、国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。

TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:

  • DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
  • 而 TIMESTAMP 值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。

提示:如果为一个 DATETIME 或 TIMESTAMP 对象分配一个 DATE 值,结果值的时间部分被设置为00:00:00,因为 DATE 值未包含时间信息。如果为一个 DATE 对象分配一个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因为DATE 值未包含时间信息。

四、字符串类型

字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。

MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等。

下表中列出了 MySQL 中的字符串数据类型,括号中的M表示可以为其指定长度,L表示实际字符长度。

类型名称 说明 存储需求
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 个字节。

一个汉字占多大字节长度与编码有关:

  • UTF-8:一个汉字=3个字节
  • GBK:一个汉字=2个字节

选择依据

  • 经常变化的字段用 varchar
  • 知道固定长度的用 char
  • 尽量用 varchar
  • 超过 255 字符的只能用 varchar 或者 text
  • 能用 varchar 的地方不用 text

查询字符串数据实际字节长度

SELECT LENGTH(字段名) FROM 表名 [WHERE Exp]

CHARVARCHAR类型

CHAR(M)类型为固定长度字符串,在定义时指定字符串列长,占用空间固定。存储时如果长度不够会自动在后面补上空格,检索时会自动把尾部的空格去掉
VARCHAR(M)类型为可变长度字符串,M表示最大字符个数(无论中文或英文),M的范围是 0~65535。存储和检索时不会将末尾的空格去除。占用空间由字符串的实际长度和使用的字符集确定。如VARCHAR(M)表示最长允许存储字符个数为M的字符串(无论中文还是英文),实际占用的空间为字符串的实际字节长度加 1。

TEXT类型

TEXT 列保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。

TEXT 类型分为 4 种:TINYTEXT、TEXT、MEDIUMTEXTLONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。

  • TINYTEXT 表示长度为 255(2^8-1)字符的 TEXT 列。
  • TEXT 表示长度为 65535(2^16-1)字符的 TEXT 列。
  • MEDIUMTEXT 表示长度为 16777215(2^24-1)字符的 TEXT 列。
  • LONGTEXT 表示长度为 4294967295(2^32-1)字符的 TEXT 列。

ENUM类型

ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。其语法格式如下:

<字段名> ENUM( '值1', '值1',, '值n' )

字段名指将要定义的字段,值 n 指枚举列表中第 n 个值。

ENUM 类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个。如果创建的成员中有空格,尾部的空格将自动被删除

ENUM 值在内部用整数表示,每个枚举值均有一个索引值;列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号,枚举最多可以有 65535 个元素。

例如,定义 ENUM 类型的列(‘first’,‘second’,‘third’),该列可以取的值和每个值的索引如下表所示。

索引
NULL NULL
‘’ 0
first 1
second 2
third 3

ENUM 值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚举值前。

提示:ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULL,NULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。

SET类型

SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用逗号,隔开,语法格式如下:

SET( '值1', '值2',, '值n' )

与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除

但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。

提示:
1.如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;
2.插入 SET 字段的值的顺序并不重要,MySQL会在存入数据库时,按照定义的顺序显示;
3.如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。

五、二进制类型

下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。

类型名称 说明 存储需求
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类型

位字段类型。M表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充
例如,为 BIT(6) 列分配一个值 b’101’,其效果与分配 b’000101’ 相同。

BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入 BIT(4) 类型的字段中的。

提示:默认情况下,MySQL不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定的范围内。

BINARYVARBINARY类型

BINARYVARBINARY 类型类似于 CHARVARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下,其中M表示字节长度:

列名称 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 是一个二进制的对象,用来存储可变数量的数据,通常用来存储编码后的文件。
BLOB 类型分为 4 种:TINYBLOB、BLOB、MEDIUMBLOBLONGBLOB,它们可容纳值的最大长度不同,如下表所示。

数据类型 存储范围
TINYBLOB 最大长度为255 (2^8-1)字节
BLOB 最大长度为65535 (2^16-1)字节
MEDIUMBLOB 最大长度为16777215 (2^24-1)字节
LONGBLOB 最大长度为4294967295 (2^32-1)字节,大约4GB

BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非二进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。

参考

MySQL教程:MySQL数据库学习宝典(从入门到精通)——C语言中文网
MySQL 数据类型——菜鸟教程
MySQL 用于存放小数的数值类型(浮点数、定点数)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!