【MySQL】004.MySQL数据类型
文章目录
- 1. 数据类型分类
- 2. 数值类型
- 2.1 tinyint类型
- 2.2 bit类型
- 2.3 小数类型
- 2.3.1 float
- 2.3.2 decimal
- 2.4 字符串类型
- 2.4.1 char
- 2.4.2 varchar
- 2.4.3 char和varchar比较
- 2.5 日期和时间类型
- 2.6 enum和set
- 2.7 enum和set类型查找
1. 数据类型分类
2. 数值类型
2.1 tinyint类型
创建一个tinyint
类型的表
- 首先我们创建一个名叫
t1
的表
create table if not exists t1(num tinyint);
- 查看
t1
表结构
desc t1;
- 查看当前数据库的表名称
show tables;
- 显示创建这个表时对应的语法细节
show create table t1 \G;
- 插入数据
insert into t1 values (-128);
insert into t1 values(127);
insert into t1 values(0);
insert into t1 values(1);
insert into t1 values(-1);
- 查表当中的内容
当我们插入128
,-129
的时候就会发现报错插入的数据超出数据范围。因为tinyint
的数据范围是-128 - 127
创建一个无符号的tinyint
类型的表 - 首先我们创建一个名叫
t2
的表
create table if not exists t2(num tinyint unsigned);
- 查看数据库中的表
- 查看
t2
表的结构
desc t2;
- 插入数据
insert into t2 values(0);insert into t2 values(255);insert into t2 values(100);
当我们插入-1
或者256
的时候就会发现,插入的数据范围超过了指定类型,mysql
的做法是直接拦截,不让我们做插入。
结论:如果我们向mysql
特定的类型中插入不合法的数据你,mysql
一般都是直接拦截我们,不让我们做对应的操作。
这里就要和c语言中的区别一下:当我们在c语言中插入 char c = 1234567
,而char
类型的数据范围是-128-127
,此时就会发生截断,而mysql
这里是直接不让我们插入。
反过来,如果我们向mysql
中插入数据成功了,此时插入的数据一定是合法的。
所以mysql
中一般而言:数据类型本身也是一种约束。(约束就能倒逼程序员,让程序员尽可能正确的插入,另外如果你不是一个很好的使用者,mysql也能确保插入数据的合法性)。
MySQL
中建立属性列:一般是列名称在前,类型在后。
2.2 bit类型
基本语法:
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
- 创建
t3
表
create table if not exists t3(id int,online bit(1));
online
表示当前用户是否在线
- 查看表的结构
desc t3;
- 插入数据
insert into t3 (id,online) values (123,0);
insert into t3 (id,online) values (124,1);
当我们再次插入5,3,2
时就会发现不让我们进行插入了。
原因是online
只有一个比特位,我们只能插入0
,或者1
。
- 查看表中的内容
select * from t3;
我们的bit
数据为什么会以十六进制的形式显示呢?
原因是在MySQL8.0
版本中,客户端会默认开启--binary-as-hex
这个选项,导致bit
字段显示为十六进制 。
方法1:显式转换字段类型
通过SQL函数将BIT
字段转换为需要的格式:
-- 转换为十进制数字
SELECT id, flags + 0 AS dec_value FROM test_bit;-- 转换为二进制字符串(如 '01000001')
SELECT id, BIN(flags) AS bin_value FROM test_bit;-- 转换为ASCII字符(如 'A')
SELECT id, CHAR(CAST(flags AS UNSIGNED)) AS char_value FROM test_bit;
方法2:调整客户端参数
在连接MySQL时,禁用十六进制显示二进制数据的选项:
mysql --skip-binary-as-hex -u your_user -p
或在配置文件(如~/.my.cnf
)中永久禁用:
[client]
binary-as-hex = OFF
方法3:使用CAST函数直接转换
将BIT
字段强制转换为CHAR
类型:
SELECT id, CAST(flags AS CHAR) AS char_raw FROM test_bit;
但此方法可能仍显示为二进制字符串(如b'01000001'
),需进一步处理:
SELECT id, CHAR(CAST(flags AS UNSIGNED)) AS char_value FROM test_bit;
2.3 小数类型
2.3.1 float
语法:
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节
- 创建一个表
t5
(有符号)-99.99-99.99
create table if not exists t5(id int,salary float(4,2));
t5
表的类型
desc t5;
- 插入数据
insert into t5 (id,salary) values (1,99.99);
insert into t5 (id,salary) values (2,-99.99);
insert into t5 (id,salary) values (3,-12.34);
- 插入
insert into t5 (id,salary) values (6,100.00);
insert into t5 (id,salary) values (7,100.0);
当我们插入100.00
和100.0
的时候就会发现不让我们插入。
- 插入
insert into t5 (id,salary) values (4,23.456);
insert into t5 (id,salary) values (5,23.454);
当我们插入23.456
和23.454
的时候,MySQL
会四舍五入将数据插入表中。但是当我们插入99.995
,99.996
的时候就不让我们插入了,所以说五入也是有条件的。
- 创建一个表
t6
(无符号)
create table if not exists t6(id bigint,salary float(4,2) unsigned);
- 表的类型
desc t6;
- 插入数据
insert into t6 (id,salary) values(1,0);
insert into t6 (id,salary) values(1,99.99);
当我们插入99.996
和99.997
的时候我们就会发现都不行
说明(4,2)
的时候的上限还是4
位。
当我们插入负数的时候发现也不行,说明我们如果定义了一个数据类型位unsigned
,它会直接把我们的数据范围砍掉负数部分,剩下的部分就是我们的取值范围。
2.3.2 decimal
语法:
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
- decimal(5,2) 表示的范围是 -999.99 ~ 999.99
- decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样
- 创建一个表
t7
create table if not exists t7(f1 float(10,8),f2 decimal(4,2));
- 查看表结构
desc t7;
- 插入数据
insert into t7 (f1,f2) values (10.0,99.99);
insert into t7 (f1,f2) values (10.0,-99.99);
insert into t7 (f1,f2) values (10.0,0.1);
insert into t7 (f1,f2) values (10.0,99.994);
insert into t7 (f1,f2) values (10.0,23.935);
- 查看表中的数据
- 修改
t7
alter table t7 modify f2 decimal(10,8);
- 给
f1
和f2
插入同样的数据
insert into t7 (f1,f2) values (23.12345612,23.12345612);
说明:float表示的精度大约是7位
decimal
整数最大位数m
为65。支持小数最大位数d
是30。如果d
被省略,默认为0.如果m被省略,默认是10。
建议:如果希望小数的精度高,推荐使用decimal。
2.4 字符串类型
2.4.1 char
语法:
mysql> create table if not exists t8(-> id int,-> name char(2)-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t8;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | char(2) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t8 (id,name) values (1,'a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,'b');
Query OK, 1 row affected (0.01 sec)mysql> insert into t8 (id,name) values (1,'ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,'abc');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from t8;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 1 | b |
| 1 | ab |
+------+------+
3 rows in set (0.00 sec)mysql> insert into t8 (id,name) values (1,'中');
Query OK, 1 row affected (0.01 sec)mysql> insert into t8 (id,name) values (1,'中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 (id,name) values (1,'中国人');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from t8;
+------+--------+
| id | name |
+------+--------+
| 1 | a |
| 1 | b |
| 1 | ab |
| 1 | 中 |
| 1 | 中国 |
+------+--------+
5 rows in set (0.00 sec)
说明:
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
注意:mysql
中的字符和C/C++
中的字符是不一样的,mysql
中的一个字符,一个数字,一个汉字都是一个字符。
2.4.2 varchar
语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 ,21845个字符
案例:
mysql> create table if not exists t9(-> id int,-> name varchar(6)-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t9 (id ,name) values (123,'中');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,'中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,'中国人');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,'中国人,');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,'中国人,加');
Query OK, 1 row affected (0.01 sec)mysql> insert into t9 (id ,name) values (123,'中国人,加油');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 (id ,name) values (123,'中国人,加油!');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> later table t9 modify name varchar(65536);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'later table t9 modify name varchar(65536)' at line 1
说明:
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
2.4.3 char和varchar比较
如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
2.5 日期和时间类型
常用的日期有如下三个:
date
:日期yyyy-mm-dd
,占用三字节datetime
时间日期格式yyyy-mm-dd HH:ii:ss'
表示范围从 1000 到 9999 ,占用八字节timestamp
:时间戳,从1970年开始的yyyy-mm-dd HH:ii:ss
格式和datetime
完全一致,占用四字节
在MySQL8.0 版本中时间戳不自动显示的解决方法:
方法1:修改表结构,显式设置默认值
在定义时间戳字段时,添加DEFAULT CURRENT_TIMESTAMP
或ON UPDATE
子句:
CREATE TABLE example (id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 插入时自动填充updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时自动刷新
);
方法2:调整系统变量(不推荐,需谨慎)
将explicit_defaults_for_timestamp
设为OFF
,恢复旧版自动行为。但需注意,这可能影响其他表的预期行为:
SET GLOBAL explicit_defaults_for_timestamp = OFF;
注意:此方法需重启MySQL服务并重建表,仅建议在明确了解影响后使用。
方法3:插入时手动赋值
若需保留字段灵活性,可在插入语句中直接指定时间戳:
INSERT INTO example (id, created_at) VALUES (1, CURRENT_TIMESTAMP);
案例:
mysql> create table if not exists t10(-> t1 date,-> t2 datetime,-> t3 timestamp default current_timestamp-> );
Query OK, 0 rows affected (0.04 sec)mysql> desc t10;
+-------+-----------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-------------------+
| t1 | date | YES | | NULL | |
| t2 | datetime | YES | | NULL | |
| t3 | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-------+-----------+------+-----+-------------------+-------------------+
3 rows in set (0.00 sec)mysql> insert into t10 (t1,t2) values ('2000-10-01','1949-10-01 08:00:00');
Query OK, 1 row affected (0.00 sec)//timestamp的应用场景
mysql> create table if not exists t11(-> content text,-> time timestamp default current_timestamp-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into t11 (content) values ('这个世界还是好人多');
Query OK, 1 row affected (0.00 sec)mysql> select * from t11;
+-----------------------------+---------------------+
| content | time |
+-----------------------------+---------------------+
| 这个世界还是好人多 | 2025-04-19 18:04:42 |
+-----------------------------+---------------------+
1 row in set (0.00 sec)mysql> update t11 set content='这个世界还是好人多,我说的';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from t11;
+-----------------------------------------+---------------------+
| content | time |
+-----------------------------------------+---------------------+
| 这个世界还是好人多,我说的 | 2025-04-19 18:04:42 |
+-----------------------------------------+---------------------+
1 row in set (0.00 sec)
2.6 enum和set
语法:
- enum:枚举,单选类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
- set:集合,多选类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
案例:
mysql> create table if not exists votes(-> username varchar(30),-> gender enum('男','女'),-> hobby set('代码','羽毛球','乒乓球','篮球','足球')-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc votes;
+----------+---------------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------------------------------------------+------+-----+---------+-------+
| username | varchar(30) | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
| hobby | set('代码','羽毛球','乒乓球','篮球','足球') | YES | | NULL | |
+----------+---------------------------------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into votes values ('张飞','男','代码');
Query OK, 1 row affected (0.00 sec)
mysql> insert into votes values ('孙尚香','女','羽毛球');
Query OK, 1 row affected (0.00 sec)//当我们插入枚举的以外的值时我们会发现是不被允许的。
mysql> insert into votes values ('孙权','男','游泳');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
mysql> insert into votes values ('张飞','b','代码');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> insert into votes values ('张飞','a','篮球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1//当我们插入1,2时我们会发现是可以的,当我们插入3时是不被允许的
mysql> insert into votes values ('李白',1,'代码');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values ('西施',2,'代码');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values ('庄周',3,'代码');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
//所以我们在枚举时,能写对应的‘男’或者‘女’,也可以写对应的下标。注意:这个下标是从1开始的,表示第一个枚举值,第二个枚举值,有几个枚举值就只能到几。mysql> insert into votes values ('曹操',1,'乒乓球');
Query OK, 1 row affected (0.00 sec)
//在集合当中不允许插入不存在的爱好
mysql> insert into votes values ('曹操',1,'飞盘');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
//可以多爱好进行插入
mysql> insert into votes values ('曹操',1,'乒乓球,羽毛球,篮球');
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
+-----------+--------+----------------------------+
6 rows in set (0.00 sec)mysql> insert into votes values ('刘表',1,0);
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values ('刘表',1,1);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
+-----------+--------+----------------------------+
8 rows in set (0.00 sec)mysql> insert into votes values ('刘表',1,2);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
+-----------+--------+----------------------------+
9 rows in set (0.00 sec)//正常来说3应该是乒乓球,可是为什么表中什么都没有呢?
mysql> insert into votes values ('刘表',1,3);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
+-----------+--------+----------------------------+
10 rows in set (0.00 sec)//正常情况下插入4的时候应该是篮球,可为什么会是乒乓球?
mysql> insert into votes values ('刘表',1,4);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
| 刘表 | 男 | 乒乓球 |
+-----------+--------+----------------------------+
11 rows in set (0.00 sec)mysql> insert into votes values ('夏侯惇',1,7);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 孙尚香 | 女 | 羽毛球 |
| 李白 | 男 | 代码 |
| 西施 | 女 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
| 刘表 | 男 | 乒乓球 |
| 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |
+-----------+--------+----------------------------+
12 rows in set (0.00 sec)
NULL
:表示空什么都没有
''
:表示有东西,只不过这个东西是空串
(‘代码’,‘羽毛球’,‘乒乓球’,‘篮球’,‘足球’)将这5
个爱好想象成5
个比特位,当我们插入1
时00000 -> 00001
,1
这个比特位的位置代表的是‘代码’这个爱好,这个位置为0
还是为1
代表有没有这个爱好,如果为1
代表的就是有‘代码这个爱好’
00010
代表的就是‘羽毛球’这个爱好。
7
的二进制序列为00111
,所以表中低三个爱好就被设置了(夏侯惇)。
所以当我们向一个集合当中去插入爱好时,这个数字就代表的是位图,比特位的从低到高依次是爱好的从左向右。比特位的位置代表的是哪一个爱好,比特位为零为一代表的是是否有这个爱好。
枚举是下标,集合是位图
2.7 enum和set类型查找
- 在enum中选择
mysql> select * from votes where gender='男';
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 李白 | 男 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
| 刘表 | 男 | 乒乓球 |
| 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |
+-----------+--------+----------------------------+
10 rows in set (0.01 sec)mysql> select * from votes where gender='女';
+-----------+--------+-----------+
| username | gender | hobby |
+-----------+--------+-----------+
| 孙尚香 | 女 | 羽毛球 |
| 西施 | 女 | 代码 |
+-----------+--------+-----------+
2 rows in set (0.00 sec)//也可以根据1,2进行选择
mysql> select * from votes where gender=1;
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 张飞 | 男 | 代码 |
| 李白 | 男 | 代码 |
| 曹操 | 男 | 乒乓球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | |
| 刘表 | 男 | 代码 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
| 刘表 | 男 | 乒乓球 |
| 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |
+-----------+--------+----------------------------+
10 rows in set (0.00 sec)mysql> select * from votes where gender=2;
+-----------+--------+-----------+
| username | gender | hobby |
+-----------+--------+-----------+
| 孙尚香 | 女 | 羽毛球 |
| 西施 | 女 | 代码 |
+-----------+--------+-----------+
2 rows in set (0.00 sec)
- 在set中选择
//爱好只有‘羽毛球’
mysql> select * from votes where hobby='羽毛球';
+-----------+--------+-----------+
| username | gender | hobby |
+-----------+--------+-----------+
| 孙尚香 | 女 | 羽毛球 |
| 刘表 | 男 | 羽毛球 |
+-----------+--------+-----------+
2 rows in set (0.00 sec)
//数字选
mysql> select * from votes where hobby=2;
+-----------+--------+-----------+
| username | gender | hobby |
+-----------+--------+-----------+
| 孙尚香 | 女 | 羽毛球 |
| 刘表 | 男 | 羽毛球 |
+-----------+--------+-----------+
2 rows in set (0.00 sec)
上面我们查的是爱好中只有‘羽毛球’,但我们要是想查爱好中包含‘羽毛球’呢?
集合查询使用find_ in_ set函数:
//在‘a,b,c’中查找‘a’,成功返回1,失败返回0
mysql> select find_in_set('a','a,b,c');
+--------------------------+
| find_in_set('a','a,b,c') |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('d','a,b,c');
+--------------------------+
| find_in_set('d','a,b,c') |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,b','a,b,c');
+----------------------------+
| find_in_set('a,b','a,b,c') |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,d','a,b,c');
+----------------------------+
| find_in_set('a,d','a,b,c') |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('c','a,b,c');
+--------------------------+
| find_in_set('c','a,b,c') |
+--------------------------+
| 3 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('b','a,b,c');
+--------------------------+
| find_in_set('b','a,b,c') |
+--------------------------+
| 2 |
+--------------------------+
1 row in set (0.01 sec)
- 在集合当中查找某一个元素是否存在。
- 判断元素是否在集合当中,不是判断是否相等。
mysql> select * from votes where find_in_set('羽毛球',hobby);
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 孙尚香 | 女 | 羽毛球 |
| 曹操 | 男 | 羽毛球,乒乓球,篮球 |
| 刘表 | 男 | 羽毛球 |
| 刘表 | 男 | 代码,羽毛球 |
| 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |
+-----------+--------+----------------------------+
5 rows in set (0.00 sec)
//我们要是想查看包含‘代码’和‘羽毛球’的呢?
//where相当于一种条件判断,可以有一个函数对应的结果,也可以把多种函数连起来
mysql> select * from votes where find_in_set('羽毛球',hobby) and find_in_set('代码',hobby);
+-----------+--------+----------------------------+
| username | gender | hobby |
+-----------+--------+----------------------------+
| 刘表 | 男 | 代码,羽毛球 |
| 夏侯惇 | 男 | 代码,羽毛球,乒乓球 |
+-----------+--------+----------------------------+
2 rows in set (0.00 sec)
👍 如果对你有帮助,欢迎:
- 点赞 ⭐️
- 收藏 📌
- 关注 🔔
相关文章:
【MySQL】004.MySQL数据类型
文章目录 1. 数据类型分类2. 数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float2.3.2 decimal 2.4 字符串类型2.4.1 char2.4.2 varchar2.4.3 char和varchar比较 2.5 日期和时间类型2.6 enum和set2.7 enum和set类型查找 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 …...
使用docker在manjaro linux系统上运行windows和ubuntu
因为最近项目必须要使用指定版本的solidworks和maxwell(都只能在win系统上使用), 且目前的ubuntu容器是没有桌面的,导致我运行不了一些带图形的ros2功能。无奈之下,决定使用docker-compose写一下配置文件,彻底解决问题…...
Flask应用部署通用指南
IIS 部署 Python Flask 应用通用指南 目录 概述环境准备应用准备wfastcgi 配置IIS 网站配置权限配置静态文件处理安全配置性能优化常见问题与解决方案生产环境最佳实践 概述 将 Flask 应用部署到 Windows IIS 服务器上需要使用 WSGI 适配器(如 wfastcgi…...
数据驱动增长:大数据与营销自动化的结合之道
数据驱动增长:大数据与营销自动化的结合之道 在这个信息爆炸的时代,企业如果还靠拍脑袋做营销决策,那基本等同于闭着眼睛开车,撞上南墙只是时间问题。大数据和营销自动化的结合,让营销从传统的经验主义走向科学决策&a…...
[Java微服务组件]注册中心P3-Nacos中的设计模式1-观察者模式
在P1-简单注册中心实现和P2-Nacos解析中,我们分别实现了简单的注册中心并总结了Nacos的一些设计。 本篇继续看Nacos源码,了解一下Nacos中的设计模式。 目录 Nacos 观察者模式 Observer Pattern观察者模式总结 Nacos 观察者模式 Observer Pattern 模式定…...
Java—— 常见API介绍 第二期
Runtime 说明: Runtime表示当前虚拟机的运行环境 获取Runtime对象的方法是静态的,可以用类名调用 不能用new关键字创建Runtime对象,只能调用获取Runtime对象的方法获取对象 其他的方法不是静态的,不能直接用类名调用,…...
意志力的源头——AMCC(前部中扣带皮层)
AMCC(前部中扣带皮层)在面对痛苦需要坚持的事情时会被激活。它的存在能够使人类个体在面临困难的事、本能感到不愿意的麻烦事情时,能够自愿地去做这些事——这些事必须是局部痛苦或宏观的痛苦,即微小的痛苦micro-sucks。 AMCC更多…...
ProfiNet转DeviceNet边缘计算网关多品牌集成实践:污水处理厂设备网络融合全流程解析
一、行业背景 随着环保政策趋严,污水处理行业对自动化、数据实时性和设备兼容性需求激增。传统污水处理厂普遍存在设备协议异构(如DeviceNet、ProfiNet混用)、数据孤岛严重的问题,现需通过捷米特DeviceNet转ProfiNet协议转换网关…...
CCLinkIE转EtherCAT边缘计算网关构建智能产线:跨协议设备动态组网与数据优化传输
一、行业背景 随着新能源汽车市场爆发式增长,汽车制造企业对产线效率、设备协同性及柔性生产能力的要求显著提升。传统产线多采用CC-LinkIEFieldBasic(CCLINKIEFB)协议的三菱PLC控制系统,而新一代伺服驱动设备普遍采用EtherCAT协…...
C 语言中的高级数据结构与内存管理
一、引言 C 语言作为一种广泛应用的系统级编程语言,以其高效性和灵活性著称。在 C 语言编程中,高级数据结构和内存管理是两个至关重要的方面。高级数据结构能够帮助我们更高效地组织和处理数据,而合理的内存管理则是保证程序性能和稳定性的关…...
Django 实现服务器主动给客户端发送消息的几种常见方式及其区别
Django Channels 原理 :Django Channels 是 Django 的一个扩展,它通过使用 WebSockets 等协议来处理长连接,使服务器能够与客户端建立持久连接,从而实现双向通信。一旦连接建立,服务器可以随时主动向客户端发送消息。…...
BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])
目录 一、规范要求 1、协议章节 2、测试目的 二、测试方法 1、样机初值条件: 2、测试步骤: 方法一:频谱仪 方法二:综测仪CMW500 3、预期结果 一、规范要求 1、协议章节 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…...
rabbitmq 面试题
一、基础概念 1. 什么是 RabbitMQ? - 基于 AMQP 协议的开源消息中间件,用于实现系统间的异步通信和解耦,支持多种消息模式(如发布/订阅、路由、主题等)。 1. 你了解那个rabbitmq, rabbitmq 的 虚拟机是…...
论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/chat/3367091682540290 速览 研究动机…...
spring事务事务传播
POROPAGATION_REQUIRED(必须) 解释: 存在事务时 当前方法已在事务中运行,直接加入该事务 无事务 则自动开启一个新事物,并在方法执行结束后提交或者回滚 举例 java Transactional public void transfer() {accountService.reduceBalance…...
JMeter介绍
文章目录 1. JMeter简介2. JMeter 下载3. JMeter修改编码集4. 启动并运行JMeter 1. JMeter简介 JMeter 是 Apache 组织使用 Java 开发的一款测试工具: 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序是否能返回期望的结果 优…...
Elasticsearch:使用 ES|QL 进行搜索和过滤
本教程展示了 ES|QL 语法的示例。请参考 Query DSL 版本,以获得等效的 Query DSL 语法示例。 这是一个使用 ES|QL 进行全文搜索和语义搜索基础知识的实践介绍。 有关 ES|QL 中所有搜索功能的概述,请参考《使用 ES|QL 进行搜索》。 在这个场景中&#x…...
面向新一代扩展现实(XR)应用的物联网框架
中文标题: 面向新一代扩展现实(XR)应用的物联网框架 英文标题: Towards an IoT Framework for the New Generation of XR Applications 作者信息 Joo A. Dias,UNIDCOM - IADE,欧洲大学,里斯本&…...
Docker Overlay 网络的核心工作(以跨节点容器通信为例)
Docker 的 overlay 网络是一种基于 VXLAN(Virtual Extensible LAN)的多主机网络模式,专为 Docker Swarm 集群设计,用于实现跨节点的容器通信。它通过虚拟二层网络,允许容器在不同主机上像在同一局域网内一样通信。Dock…...
开发基于python的商品推荐系统,前端框架和后端框架的选择比较
开发一个基于Python的商品推荐系统时,前端和后端框架的选择需要综合考虑项目需求、开发效率、团队熟悉度以及系统的可扩展性等因素。 以下是一些推荐的框架和建议: 后端框架 Flask 优点: 轻量级:Flask的核心非常简洁,…...
CSRF 请求伪造Referer 同源置空配合 XSSToken 值校验复用删除
#CSRF- 无检测防护 - 检测 & 生成 & 利用(那数据包怎么整 找相似源码自己搭建整) 检测:黑盒手工利用测试,白盒看代码检验(有无 token ,来源检验等) 生成: BurpSuite->Engagement t…...
Datawhale AI春训营】AI + 新能源(发电功率预测)Task1
赛题链接 官网 新能源发电功率预测赛题进阶方案 下面是ai给的一些建议 新能源发电功率预测赛题进阶方案 一、时序特性深度挖掘 1. 多尺度周期特征 # 分钟级周期编码 train[15min_index] (train[hour]*4 train[minute]//15)# 周周期特征 train[weekday] pd.to_datetime…...
@EnableAsync+@Async源码学习笔记之二
从本文开始,就正式进入源码追踪阶段了,上一篇的最后我们提到了 EnableAsync 注解上的 Import(AsyncConfigurationSelector.class)了,本文就来看下它,源码如下: package org.springframework.scheduling.annotation;im…...
C++ STL 环形队列模拟实现
C STL 环形队列模拟实现 下面是一个使用C STL实现的环形队列(Circular Queue)的完整示例: #include <iostream> #include <vector> #include <stdexcept>template <typename T> class CircularQueue { private:std…...
每天五分钟深度学习PyTorch:0填充函数在搭建神经网络中的应用
本文重点 在深度学习中,神经网络的搭建涉及对输入数据、权重矩阵以及中间计算结果的处理。masked_fill 是 PyTorch 等深度学习框架中常用的张量操作函数,它通过布尔掩码(mask)对张量中的指定元素进行填充。当将矩阵元素填充为 0 时,masked_fill 在神经网络中发挥着重要作…...
pycharm中怎么解决系统cuda版本高于pytorch可以支持的版本的问题?
在PyCharm中安装与系统CUDA版本不一致的PyTorch是可行的。以下是解决方案的步骤: 1. 确认系统驱动兼容性 检查NVIDIA驱动支持的CUDA版本:运行 nvidia-smi,右上角显示的CUDA版本是驱动支持的最高版本。只要该版本不低于PyTorch所需的CUDA版本…...
【概率论】条件期望
在高等概率论中,给定一个概率空间 ( Ω , F , P ) (\Omega, \mathcal{F}, P) (Ω,F,P) 和其子 σ \sigma σ-代数 G ⊆ F \mathcal{G} \subseteq \mathcal{F} G⊆F,随机变量 X X X 关于 G \mathcal{G} G 的 条件期望 E [ X ∣ G ] E[X|\mathcal{G}…...
【java实现+4种变体完整例子】排序算法中【计数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是计数排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、计数排序基础实现 原理 通过统计每个元素的出现次数,按顺序累加得到每个元素的最终位置,并填充到结果数组中。 代码示…...
Qt C++ 解析和处理 XML 文件示例
使用 Qt C 解析和处理 XML 文件 以下是使用 Qt C 实现 XML 文件处理的几种方法,包括解析、创建和修改 XML 文件。 1. 使用 QXmlStreamReader (推荐方式) #include <QFile> #include <QXmlStreamReader> #include <QDebug>void parseXmlWithStr…...
在服务器上部署MinIO Server
MinIO的优势 高性能:MinIO号称是目前速度最快的对象存储服务器,据称在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s,可惜我的磁盘跟不上 兼容性:MinIO基于Amazon S3协议,并提供了与S3兼…...
第二十七讲:AI+农学导论
关键词:人工智能、农业、作物识别、遥感、机器学习、案例实战 目录 📌 一、为什么农业需要人工智能? 📈 二、AI在农学中的典型应用场景 🧪 三、实战案例:AI识别作物类型(以随机森林为例) ✅ 数据集:iris(模拟作物种类识别) 📦 所需包: 🚀 数据准备: …...
医院科研科AI智能科研支撑平台系统设计架构方案探析
一、系统设计概述 1.1 系统定位 本系统是基于MCP(Model Context Protocol,模型上下文协议)协议构建的智能科研支撑平台,旨在为医院科研科室提供全流程AI辅助能力,覆盖课题立项、数据采集、分析建模到成果转化的完整科研生命周期。系统通过MCP协议实现与医院信息系统的深…...
Python基础总结(七)之条件语句
文章目录 条件语句if一、Python中的真假二、条件语句格式2.1 if语句格式2.2 if-else语句2.3 if-elif-else语句 三、if语句嵌套 条件语句if 条件语句其实就是if语句,在讲解if语句之前需要知道Python中对于真假的判断。 一、Python中的真假 在Python中非0的都为真&…...
Day10【基于encoder- decoder架构实现新闻文本摘要的提取】
实现新闻文本摘要的提取 1. 概述与背景2.参数配置3.数据准备4.数据加载5.主程序6.预测评估7.生成效果8.总结 1. 概述与背景 新闻摘要生成是自然语言处理(NLP)中的一个重要任务,其目标是自动从长篇的新闻文章中提取出简洁、准确的摘要。近年来…...
深度解析算法之二分查找(2)
17.二分查找 题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target…...
前端工程化之自动化测试
自动化测试 自动化测试为什么需要测试?什么时候需要考虑测试测试类型前端测试框架单元测试Jest 重点掌握项目示例package.jsonsrc/utils/math.tssrc/utils/math.test.ts进行测试jest.config.js覆盖率直观看覆盖率coverage/lcov-report/index.html src/main.test.tst…...
CANFD技术在新能源汽车通信网络中的应用与可靠性分析
一、引言 新能源汽车产业正处于快速发展阶段,其电子系统复杂度不断攀升,涵盖众多传感器、控制器与执行器。高效通信网络成为确保新能源汽车安全运行与智能功能实现的核心要素。传统CAN总线因带宽限制,难以满足高级驾驶辅助系统(A…...
【机器学习】朴素贝叶斯算法:原理剖析与实战应用
引言 朴素贝叶斯算法就像是一位善于从经验中学习的侦探,根据已有的线索来推断未知事件的概率。这是一种基于概率论的分类算法,以贝叶斯定理为基础,却做了一个"朴素"的假设:认为所有特征彼此独立。虽然这个假设在现实中…...
【更新完毕】2025妈妈杯C题 mathercup数学建模挑战赛C题数学建模思路代码文章教学:音频文件的高质量读写与去噪优化
完整内容请看文章最下面的推广群 我将先给出文章、代码、结果的完整展示, 再给出四个问题详细的模型 面向音频质量优化与存储效率提升的自适应编码与去噪模型研究 摘 要 随着数字媒体技术的迅速发展,音频处理技术在信息时代的应用愈加广泛,特别是在存储…...
UI键盘操作
1、Selenium中send_keys除了可以模拟键盘输入之外,还有些时候需要操作键盘上的按键,甚至是组合键,比如CTRLA,CTRLC等, 所以我们需要代码操作键盘。使用的是send_keys里的Keys的类。 from selenium.webdriver.common.keys import …...
【正则表达式】正则表达式使用总结
正则表达式除了匹配普通字符外,还可以匹配特殊字符,这些特殊字符被称为“元字符”。 特殊字符(元字符) 限定符:用于指定正则表达式中某个组件的出现次数。常见的限定符包括: *:0次或多次 +:1次或多次 ?:0次或1次 {n}:恰好n次…...
Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
一、前言 在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如…...
Spring Boot 中基于 Reactor 的服务器端事件(SSE)推送机制实践
Spring Boot 3.0 中基于 Reactor 的服务器端事件(SSE)推送机制实践 在现代 Web 应用开发中,实时数据交互越来越成为刚需,从股票行情的实时更新到社交平台的消息即时推送,服务器端事件(Server-Sent Events,简称 SSE)作为一种高效的单向数据传输技术,正发挥着重要作用。…...
CRC实战宝典:从原理到代码,全面攻克循环冗余校验
CRC实战宝典:从原理到代码,全面攻克循环冗余校验 github开源:CRC软硬件协同测试项目 CRC 简介 CRC(循环冗余校验)是一种强大的错误检测技术,广泛应用于数字网络和存储系统。它是确保数据完整性的重要方法…...
【愚公系列】《Python网络爬虫从入门到精通》056-Scrapy_Redis分布式爬虫(Scrapy-Redis 模块)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
ZLMediaKit 和 SRS的区别,哪个更好用?
ZLMediaKit 和 SRS(Simple RTMP Server)是两个主流的开源流媒体服务器框架,各自在功能、性能、适用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 一、核心差异对比 协议支持 ZLMediaKit:支持更广泛的流媒…...
【PyTorch】colab上跑VGG(深度学习)数据集是 CIFAR10
跑得结果是测试准确率10%,欠拟合。 import torch import torchvision.datasets from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from torchvision import datasets, transformstransform tran…...
pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图
本专栏博客第49篇文章分享了将 GroundingDINO模型导出onnx并使用c++进行部署,并尝试将onnx模型转换为trt模型,fp16进行推理,可以发现推理速度提升了一倍。为此对GroundingDINO的trt推理进行调研,发现 在GroundingDINO-TensorRT-and-ONNX-Inference项目中分享了模型导出onnx…...
编程语言基础 - C++ 面试题
C++ 面试题 tags: c++ 文章目录 C++ 面试题关键字1. const2. static3. this 指针4. inline 内联函数5. volatile6. struct, class7. enum关键字 1. const 修饰变量:该变量不能被改变 修饰指针: 指针常量: 指针本身是常量 TYPE* const pContent;指向常量的指针:指针所指向…...
JVM笔记【一】java和Tomcat类加载机制
JVM笔记一java和Tomcat类加载机制 java和Tomcat类加载机制 Java类加载 * loadClass加载步骤类加载机制类加载器初始化过程双亲委派机制全盘负责委托机制类关系图自定义类加载器打破双亲委派机制 Tomcat类加载器 * 为了解决以上问题,tomcat是如何实现类加载机制的…...