MYSQL学习笔记(十一):MYSQL数据类型讲解
前言:
- 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇+,涵盖入门、进阶、高级(一些原理分析);
- 这一篇数据类型,比较多,但是我感觉了解即可,ai时代先用先查就够了;
- 虽然MYSQL命令很多,但是自己去多敲一点,到后面忘记了,查一下就可以回忆起来使用了;
- 这一系列也是本人学习MYSQL做的笔记,也是为了方便后面忘记查询;
- 参考资料:尚硅谷、黑马、csdn和知乎博客;
- 欢迎收藏 + 关注,本人将会持续更新后端和AI算法的学习笔记。
文章目录
- 数据类型简介
- 1 整数类型
- 1.1 类型介绍
- 1.2 可选属性
- 1.3 使用场景
- 1.4 如何选择
- 2 浮点类型
- 2.1 类型介绍
- 2.2 精度说明
- 3 定点类型
- 4 日期/时间类型
- YEAR类型
- DATE 类型
- TIME 类型
- DATETIME 类型
- TIMESTAMP 类型
- **TIMESTAMP 和 DATETIME区别**
- TIMESTAMP妙用(扩展,了解即可)
- 5 字符串类型
- CHAR 和 VARCHAR 类型
- TEXT 类型
- ENUM 类型
- SET 类型
- 测试
- 6 二进制类型
- BIT 类型
- BINARY 和 VARBINARY 类型
- BLOB 类型
- 定义变量
数据类型简介
数据类型(data_type)是指系统中所允许的数据的类型。
MySQL 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则,其实这个和C、java、cpp差不多。
如果使用错误的数据类型可能会严重影响应用程序的功能和性能,所以在设计表时,应该特别重视数据列所用的数据类型。更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。
MySQL 的数据类型有大概可以分为 5 种,分别是整数类型、浮点数类型和定点数类型、日期和时间类型、字符串类型、二进制类型等。
注意:整数类型和浮点数类型可以统称为数值数据类型。
1 整数类型
1.1 类型介绍
整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
类型 | 说明 | 大小(字节) |
---|---|---|
TINYINT | 很小的整数 | 1 |
SMALLINT | 小的整数 | 2 |
MEDIUMINT | 中等大小的整数 | 3 |
INT/INTEGER | 普通大小的整数 | 4 |
BIGINT | 大整数 | 8 |
1.2 可选属性
M:
表示显示宽度,M的取值范围是(0,255)。例如,INT(5):当数据小于5位时,可以用字符填充补满所需宽度。该功能需要配置ZEROFILL
使用,表示用 0 填满宽度,否则指定显示宽度无效。
注意:设置宽度不会对原来的数据或者插入数据产生任何影响,仅仅是显示效果不同。从MySQL 8.0.17开始,整数类型不推荐使用显示宽度属性。
UNSIGNED:
所有整数类型都有一个可选的属性UNSIGNED,代表无符号类型,无符号整数类型的最小取值为0。所以,如果需要在MySQL中保存非负整数是,可以将整数类型设置为无符号类型。
1.3 使用场景
ENUM:一般用于枚举类型,比如系统设定取值范围很小且固定的场景。
SMALLINT:可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。
MEDIUMINT:用于较大整数的计算,比如车站每日的客流量等。
INT、INTEGER:取值范围足够大。
BIGINT:只有当你处理特别巨大的整数时才会用到,比如双十一的交易量。
最常用:INT
1.4 如何选择
在评估用哪种整数类型的时候,需要考虑存储空间
和可靠性
的平衡问题:
-
一方面,用占用字节数少的整数类型可以节省存储空间;
-
另一方面,要是为了节省存储空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,就可能引起
系统错误
,影响可靠性。
注意:在实际工作中,系统故障产生的成本远远超过增加几个字段存储空间所产生的成本
。因此,不要舍不得内存。
2 浮点类型
2.1 类型介绍
浮点数类型包括 FLOAT、DOUBLE和REAL。
类型 | 说明 | 大小(字节) |
---|---|---|
FLOAT | 单精度浮点数 | 4 |
DOUBLE | 双精度浮点数 | 8 |
REAL | 默认为DOUBLE | 把SQL模式设定为“REAL_AS_FLOAT ”,REAL就是FLOATSET sql_mode = "REAL_AS_FLOAT" |
2.2 精度说明
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。
浮点数一点注意点:
- MySQL允许使用
非标准语法
(其他数据库未必支持,因此如果涉及到数据前移,则最好不要这么用)- 如:FLOAT(M,D)或DOUBLE(M,D)。其中
M
称为精度,表示总共的位数;D
称为标度,表示小数的位 数。D<=M<=255,0<=D<=30。
- 如:FLOAT(M,D)或DOUBLE(M,D)。其中
- 从MySQL8.0.17开始,FLOAT(M,D)和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用了,将来可能会被移除;另外关于浮点类型FLOAT和DOUBLE的UNSIGNED也不推荐使用了,将来也可能被移除。
- FLOAT 和 DOUBLE 在不指定精度时,默认会按照实际的精度,这个由计算机架构决定(x64、x86等)
- 注意:浮点类型也可以加
UNSIGNED
,但是不会改变数据范围,例如:FLOAT(3,2) UNSIGNED任然只能表示0-9.99的范围。 - 不管是否显示设置了精度(M,D),MySQL有自己的处理方案:
- 如果存储时,整数部分超出了范围,则直接报错。
- 如果存储时,小数点部分超出范围,就分一下情况:
- 若四舍五入后,整数部分没有超出范围,就可以存储。如在FLOAT(5,2)列插入999.009,近似结果是999.01。
- 若四舍五入后,整数部分超出范围,则直接报错。如在FLOAT(5,2)列插入999.995和-999.995都会报错。
- 其他:在 MySQL 中,定点数以字符串形式存储;浮点数时需要注意,并尽量避免做浮点数比较(浮点数比较可能会出现 正数 + 正数 = 负数的情况)
3 定点类型
定点数类型为 DECIMAL。
类型 | 说明 | 大小(字节) |
---|---|---|
DECIMAL/DEC | 压缩的“严格”定点数 | M+2 |
DECIMAL(M,D)。其中M
称为精度,表示总共的位数;D
称为标度,表示小数的位数。0<=M<=65,0<=D<=30,D<M。例如:定义为DECIMAL(5,2),表示该列的取值范围是[-999.99,999.99]。
- DECIMAL(M,D)的最大值范围与DOUELE类型一样,但是有效的数据方位是由M和D决定的。DECIMAL的存储空间并不固定,由精度M决定,总共占用的存储空间为M+2个字节。也就是说,在一些对精度要求不高的场景下,比起占用同样字节长度的定点数,浮点数表达的数值范围可以更大。
- 定点数在MySQL内部是以字符串的形式进行存储的,这就决定了它一定是精确的。
- 当DECIMAL类型不指定精度和标度时,其默认为DECIMAL(10,0),当数据的精度超出了定点数的精度范围时,则MySQL同样会进行四舍五入。
- 浮点数 vs 定点数
- 浮点数相对于定点数的有点是在长度一定的情况下,浮点类型取值范围大,但是不精确,适用于需要取值范围大,又可以容忍误差的科学计算场景
- 定点数类型取值范围相对小。
4 日期/时间类型
包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
类型 | 说明 | 日期范围 | 大小(字节) |
---|---|---|---|
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 | 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。
从MySQL5.5.27开始,2位格式的YEAR已经不推荐使用。YEAR默认格式就是“YYYY”,没必要写成YEAR(4)。
CREATE TABLE test_year
(
f1 YEAR,
f2 YEAR(4)
);
INSERT INTO test_year(f1) VALUES('2021'),(2022);
INSERT INTO test_year(f1) VALUES('2155');
-- out of range value for column 'f1' at row 1
INSERT INTO test_year(f1) VALUES('2156');
INSERT INTO test_year(f1) VALUES('69'),('70'); #2069 1970
INSERT INTO test_year(f1) VALUES(0),('0');
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。
- 使用 CURRENT_DATE() 或者 NOW(),插入当前系统日期。
提示:MySQL 允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符。例如,‘98-11-31’、‘98.11.31’、‘98/11/31’和’98@11@31’ 是等价的,这些值也可以正确地插入数据库。
CREATE TABLE test_date1
(
f1 DATE
);
INSERT INTO test_date1 VALUES('2022-04-16'),('20220416'),(20220416);
INSERT INTO test_date1 VALUES('22-04-16'),('220416'),
('69-04-16'),('690416'),
('70-04-16'),('700416'),
('99-04-16'),('990416');
INSERT INTO test_date1 VALUES(220416),(690416),(700416),(990416);
INSERT INTO test_date1 VALUES(CURRENT_DATE()),(NOW());
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。
- 使用 CURRENT_TIME() 或者 NOW(),插入当前系统时间。
CREATE TABLE test_time1
(
f1 TIME
);
INSERT INTO test_time1
VALUES('10:35:30'),('2 10:35:30'),('10:35'),('2 10:35'),('1 35'),('30')
INSERT INTO test_time1 VALUES('103530'),(103530),(1035);
INSERT INTO test_time1 VALUES(NOW()),(CURRENT_TIME());
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’。
- 以 ‘YY-MM-DD HH:MM:SS’ 或者 ‘YYMMDDHHMMSS’ 字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,‘00~79’ 范围的年值转换为 ‘2000~2079’,‘80~99’ 范围的年值转换为 ‘1980~1999’。
- 以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 数字格式表示的日期和时间。
提示:MySQL 允许“不严格”语法:任何标点符号都可用作日期部分或时间部分之间的间隔符。例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+35’、‘98/12/31 113045’ 和 ‘98@12@31 113045’ 是等价的,这些值都可以正确地插入数据库。
CREATE TABLE test_datetime1
(
dt DATETIME
);
INSERT INTO test_datetime1 VALUES('2022-04-16 18:50:30'),('20220416185030');
INSERT INTO test_datetime1 VALUES('99-04-16 18:50:30'),('990416185030'),
('22-04-16 18:50:30'),('220416185030');
INSERT INTO test_datetime1 VALUES(20220202000000);
INSERT INTO test_datetime1 VALUES(CURRENT_TIMESTAMP()),(NOW());
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。在插入数据时,要保证在合法的取值范围内。
TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:
- DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
- 而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,即查询时,根据当前时区的不同,显示的时间值是不同的。
CREATE TABLE test_timestamp
(
ts TIMESTAMP
);
INSERT INTO test_timestamp VALUES('1999-01-01 01:02:03'),('1999-01-01 01:02:03'),
('99-01-01 01:02:03'),('990101010203');
INSERT INTO test_timestamp VALUES('2022@01@02@11@22@33');
INSERT INTO test_timestamp VALUES(CURRENT_TIMESTAMP()),(NOW());
TIMESTAMP 和 DATETIME区别
CREATE TABLE temp_time
(
d1 DATETIME,
d2 TIMESTAMP
);
INSERT INTO temp_time VALUES('2022-04-16 19:09:55','2022-04-16 19:09:55');
INSERT INTO temp_time VALUES(NOW(),NOW());
SELECT * FROM temp_time;
SET time_zone = '+9:00'
SELECT * FROM temp_time; #设置之后再查询一次
- 设置时区
SET time_zone = '+9:00'
TIMESTAMP妙用(扩展,了解即可)
TIMESTAMP时间戳在创建的时候可以有多重不同的特性,如:
1.在创建新记录和修改现有记录的时候都对这个数据列刷新:
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2.在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它:
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
3.在创建新记录的时候把这个字段设置为0,以后修改时刷新它:
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
4.在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它:
TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss' ON UPDATE CURRENT_TIMESTAMP
5 字符串类型
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。
下表中列出了 MySQL 中的字符串数据类型,括号中的M
表示可以为其指定长度。
类型名称 | 说明 | 长度范围 | 占用的存储空间 |
---|---|---|---|
CHAR(M) | 固定长度 | 0<=M<=255 | M 个字节 |
VARCHAR(M) | 变长字符串 | 0<=M<=65535 | M+1个字节 |
TINYTEXT | 非常小字符串 | 0<=L<=255 | L+1字节 |
TEXT | 小的字符串 | 0<=L<=65535 | L+2字节 |
MEDIUMTEXT | 中等大小的字符串 | 0<=L<=16777215 | L+3字节 |
LONGTEXT | 大的字符串 | 0<=L<=4294967295 | L+4字节 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 0<=L<=65535 | 1或2个字节,取决于枚举值的数目 (最大值为65535) |
SET | 字符串集合,字符串对象可以有零个或 多个SET成员 | 0<=L<=64 | 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员) |
CHAR 和 VARCHAR 类型
CHAR 和 VARCHAR 类型都可以存储比较短的字符串。
类型 | 特点 | 长度 | 长度范围 | 占用存储空间 |
---|---|---|---|---|
CHAR(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARCHAR(M) | 可变长度 | M | 0<=M<=65535 | (实际长度+1/2)个字节 |
CHAR类型:
- CHAR(M) 为固定长度字符串,在定义时指定字符串长度。如果不指定,则默认为1个字符。
- 如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在
右侧填充空格
以达到指定的长度。当检索 CHAR 值时,尾部的空格将被删除。 - 定义CHAR类型字段时,申明的字段长度即为CHAR类型字段所占的存储空间的字节数。
CREATE TABLE test_char
(
f1 CHAR,
f2 CHAR(5)
);
DESC test_char;
INSERT INTO test_char(f1) VALUES('h');
#Data too long for column 'f1' at row 1
INSERT INTO test_char(f1) VALUES('he');
INSERT INTO test_char(f1) VALUES('你');
INSERT INTO test_char(f2) VALUES('C语言');
#Data too long for column 'f2' at row 1
INSERT INTO test_char(f2) VALUES('C语言Plus');
#测试在右侧填充的空格,会在查询的时候去掉的情况
SELECT CONCAT(f2,'***') FROM test_char;
#注意:自己插入的空格也会被去掉
INSERT INTO test_char(f2) VALUES('fk ');
SELECT * FROM test_char;
VARCHAR类型:
- VARCHAR(M) 定义时,必须指定长度M,否则会报错。
- VARCHAR(M)指的是能存储M个字符,而实际占用的空间为字符串的实际长度加 1或者2。
- VARCHAR 在值保存和检索时尾部的空格仍保留。
#错误,没有指定长度
CREATE TABLE test_varchar
(
name VARCHAR
);
CREATE TABLE test_varchar
(
name VARCHAR(5)
);
INSERT INTO test_varchar VALUES('顿开'),('顿开顽石');
#Data too long forcolumn 'NAME' at row 1
INSERT INTO test_varchar VALUES('顿开顽石老师');
TEXT 类型
TEXT用来保存文本类型的字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。
TEXT 类型分为 4 种:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。
在向TEXT类型的字段插入数据时,系统自动按照实际长度存储,不需要预先定义长度。
类型 | 说明 | 大小(字节) |
---|---|---|
TINYTEXT | 小文本 | 0<=L<=255 |
TEXT | 普通文本 | 0<=L<=65535 |
MEDIUMTEXT | 中等大小文本 | 0<=L<=16777215 |
LONGTEXT | 长文本 | 0<=L<=4294967295 (相当于4GB字符) |
TEXT文本类型,可以存储比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来替代。还有TEXT类型不用加默认值,加了也没用。
ENUM 类型
ENUM 类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段是进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。如果创建的成员中有空格,尾部的空格将自动被删除。
类型 | 长度范围 | 占用存储空间 |
---|---|---|
ENUM | 1<=L<=65535 | 1或2个字节 |
- ENUM 值在内部用整数表示,每个枚举值均有一个索引值;
- 列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号,枚举最多可以有 65535 个元素。
ENUM 值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚举值前。
提示:ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULL,NULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。
- 查看enum字段的所有值
SELECT
column_type
FROM
information_schema. COLUMNS
WHERE
#TABLE_SCHEMA = "test" AND
DATA_TYPE = 'enum'
AND table_name="test_enum"
AND column_name="ch";
- 测试
CREATE TABLE test_enum
(
gender ENUM('男','女','unknown')
);
INSERT INTO test_enum VALUES('男');
#Data truncated for column 'ch' at row 1
INSERT INTO test_enum VALUES('中');
#可以使用索引来插入枚举元素(注意:索引从1开始)
INSERT INTO test_enum VALUES(1),('2');
#当enum字段没有申明为NOT NULL时,插入NULL也是合法的
INSERT INTO test_enum VALUES(NULL);
SELECT * FROM test_enum;
SET 类型
SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。
成员个数范围 | 占用的存储空间 |
---|---|
1<=L<=8 | 1个字节 |
9<=L<=16 | 2个字节 |
17<=L<=24 | 3个字节 |
25<=L<=32 | 4个字节 |
33<=L<=64 | 8个字节 |
- 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。
- 但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。
提示:如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;
测试
CREATE TABLE test_set
(
hobby SET('吃饭','睡觉','写Bug')
);
INSERT INTO test_set VALUES('吃饭');
INSERT INTO test_set VALUES('吃饭,睡觉');
#重复插入时,会自动删除重复数据
INSERT INTO test_set VALUES('吃饭,睡觉,吃饭');
#插入的值在set中不存在时,会报错
INSERT INTO test_set VALUES('吃饭,睡觉,花钱');
SELECT * FROM test_set;
6 二进制类型
MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频、视频等二进制数据。
包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
下表中列出了 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 不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定的范围内。
BINARY 和 VARBINARY 类型
BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串。
BLOB 类型
BLOB 是一个二进制的对象,用来存储可变数量的数据。BLOB 类型分为 4 种:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB,它们可容纳值的最大长度不同,如下表所示。
数据类型 | 存储范围 |
---|---|
TINYBLOB | 最大长度为255 (28-1)字节 |
BLOB | 最大长度为65535 (216-1)字节 |
MEDIUMBLOB | 最大长度为16777215 (224-1)字节 |
LONGBLOB | 最大长度为4294967295或4GB (231-1)字节 |
BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。
定义变量
定义用户变量使用set @变量,该变量随着用户连接断开就直接消失
,赋值都是使用set 变量名=值;一定要加分号
- 定义变量(局部,在存储过程和存储函数中)
declare 变量名[,变量名2...] 变量类型 [default 默认值]
- 赋值变量:
set 变量名1=变量值1(或者表达式)[ ,变量名2=变量值2(或者表达式)]
- 使用变量:
select 列名[,列名...] into 变量名1[,变量名二...]
mysql declare和set定义变量的区别
-
declare用来定义局部变量,比如说:一个函数中
-
@用来定义会话变量,因为mysql是cs架构的,会话变量就是在一个连接范围内都有效。