> 技术文档 > 【MySQL】004.MySQL数据类型_数据库查询数据类型

【MySQL】004.MySQL数据类型_数据库查询数据类型

【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. 数据类型分类

【MySQL】004.MySQL数据类型_数据库查询数据类型

2. 数值类型

【MySQL】004.MySQL数据类型_数据库查询数据类型

2.1 tinyint类型

创建一个tinyint类型的表

  • 首先我们创建一个名叫t1的表
create table if not exists t1( num tinyint );
  • 查看t1表结构
desc t1;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 查看当前数据库的表名称
show tables;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 显示创建这个表时对应的语法细节
show create table t1 \\G;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
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);
  • 查表当中的内容
    【MySQL】004.MySQL数据类型_数据库查询数据类型
    当我们插入128,-129的时候就会发现报错插入的数据超出数据范围。因为tinyint的数据范围是-128 - 127
    【MySQL】004.MySQL数据类型_数据库查询数据类型
    创建一个无符号的tinyint类型的表
  • 首先我们创建一个名叫t2的表
create table if not exists t2( num tinyint unsigned );
  • 查看数据库中的表
    【MySQL】004.MySQL数据类型_数据库查询数据类型
  • 查看t2表的结构
desc t2;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
 insert into t2 values(0); insert into t2 values(255); insert into t2 values(100);

当我们插入-1或者256的时候就会发现,插入的数据范围超过了指定类型,mysql的做法是直接拦截,不让我们做插入。
【MySQL】004.MySQL数据类型_数据库查询数据类型
结论:如果我们向mysql特定的类型中插入不合法的数据你,mysql一般都是直接拦截我们,不让我们做对应的操作。
这里就要和c语言中的区别一下:当我们在c语言中插入 char c = 1234567,而char类型的数据范围是-128-127,此时就会发生截断,而mysql这里是直接不让我们插入。
反过来,如果我们向mysql中插入数据成功了,此时插入的数据一定是合法的。
所以mysql中一般而言:数据类型本身也是一种约束。(约束就能倒逼程序员,让程序员尽可能正确的插入,另外如果你不是一个很好的使用者,mysql也能确保插入数据的合法性)。

MySQL中建立属性列:一般是列名称在前,类型在后

2.2 bit类型

基本语法:

bit[(M)] : 位字段类型。M表示每个值的位数,范围从164。如果M被忽略,默认为1
  • 创建t3
create table if not exists t3( id int, online bit(1) );

online表示当前用户是否在线

  • 查看表的结构
desc t3;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
insert into t3 (id,online) values (123,0);insert into t3 (id,online) values (124,1);

当我们再次插入5,3,2时就会发现不让我们进行插入了。
【MySQL】004.MySQL数据类型_数据库查询数据类型
原因是online只有一个比特位,我们只能插入0,或者1

  • 查看表中的内容
select * from t3;

【MySQL】004.MySQL数据类型_数据库查询数据类型
我们的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;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
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);

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入
insert into t5 (id,salary) values (6,100.00);insert into t5 (id,salary) values (7,100.0);

【MySQL】004.MySQL数据类型_数据库查询数据类型
当我们插入100.00100.0的时候就会发现不让我们插入。

  • 插入
insert into t5 (id,salary) values (4,23.456);insert into t5 (id,salary) values (5,23.454);

【MySQL】004.MySQL数据类型_数据库查询数据类型
当我们插入23.45623.454的时候,MySQL会四舍五入将数据插入表中。但是当我们插入99.995,99.996的时候就不让我们插入了,所以说五入也是有条件的。

  • 创建一个表t6(无符号)
create table if not exists t6( id bigint, salary float(4,2) unsigned );
  • 表的类型
desc t6;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
insert into t6 (id,salary) values(1,0);insert into t6 (id,salary) values(1,99.99);

当我们插入99.99699.997的时候我们就会发现都不行
【MySQL】004.MySQL数据类型_数据库查询数据类型
说明(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;

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 插入数据
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);

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • 查看表中的数据
    【MySQL】004.MySQL数据类型_数据库查询数据类型
  • 修改t7
alter table t7 modify f2 decimal(10,8);

【MySQL】004.MySQL数据类型_数据库查询数据类型

  • f1f2插入同样的数据
insert into t7 (f1,f2) values (23.12345612,23.12345612);

【MySQL】004.MySQL数据类型_数据库查询数据类型
说明: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 1mysql> 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 1mysql> 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 1mysql> 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比较

【MySQL】004.MySQL数据类型_数据库查询数据类型
如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(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_TIMESTAMPON 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 1mysql> insert into votes values (\'张飞\',\'b\',\'代码\');ERROR 1265 (01000): Data truncated for column \'gender\' at row 1mysql> 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个比特位,当我们插入100000 -> 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,失败返回0mysql> 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)
  1. 在集合当中查找某一个元素是否存在。
  2. 判断元素是否在集合当中,不是判断是否相等。
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)

👍 如果对你有帮助,欢迎:

  • 点赞 ⭐️
  • 收藏 📌
  • 关注 🔔