【MySQL】 数据类型

欢迎拜访:雾里看山-CSDN博客
本篇主题:【MySQL】 数据类型
发布时间:2025.1.27
隶属专栏:MySQL

在这里插入图片描述

目录

  • 数据类型分类
  • 数值类型
    • tinyint类型
      • 数值越界测试
      • 结果说明
    • bit类型
      • 基本语法
      • 使用
      • 注意事项
    • 小数类型
      • float
        • 语法
        • 使用
        • 注意事项
      • decimal
        • 语法
        • 使用
      • float 和decimal的比较
  • 字符串类型
    • char
      • 语法
      • 使用
      • 注意事项
    • varchar
      • 语法
      • 使用
      • 注意事项
    • char 和varchar 的比较和选择
  • 日期类型
    • 类型
    • 使用
  • enum和set
    • 语法
    • 使用
    • 注意事项
    • 类型查找
      • enum查找
      • set查找
        • 严格筛选
        • 函数筛选

数据类型分类

三列表格
分类数据类型说明
数值类型
bit(M)位类型。M指定位数,默认值为1,范围是1-64。
bool使用0和1表示真和假
tinyint [unsigned]带符号的范围-128 ~ 127 。无符号范围0 ~ 255。默认有符号。
smallint [unsigned]带符号的范围-215 ~ 215-1。无符号范围0 ~ 216-1。默认有符号。
int [unsigned]带符号的范围-231 ~ 231-1。无符号范围0 ~ 232-1。默认有符号。
bigint [unsigned]带符号的范围-263 ~ 263-1。无符号范围0 ~ 264-1。默认有符号。
float[(M,D)] [unsigned]M指定显示长度,D显示小数位数,占用4字节。
double[(M,D)] [unsigned]比float精度更大的小数。M指定显示长度,D显示小数位数,占用8字节。
decimal[(M,D)] [unsigned] M指定显示长度,D显示小数位数
文本、二进制类型
char(size)固定长度字符串,最大255
varchar(size)可变长度字符串,最大长度65535
blob二进制数据
text大文本,不支持全文索引,不支持默认值
日期类型
dateyyyy-mm-dd,具体到天
datetimeyyyy-mm-dd hh:mm:ss具体到秒
timestamp时间戳
String类型
enumenum是一个字符串对象,其值来自表创建时在列规定中显示枚举的一个列值。
setset是一个字符串对象,可以有零或者多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样的set成员值本身不能包含逗号。

数值类型

在这里插入图片描述

tinyint类型

tinyint smallintintbigint四个整数类型操作基本相同,不同之处只有存储的数据大小不同。我们以tinyint为例进行讲解

数值越界测试

对于有符号的整数tinyint
我们先创建一个tinyint类型的表,然后对其进行插入操作。观察越界情况。

mysql> create table if not exists t1(//创建一个表-> num tinyint-> );
Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values (-128);//进行插入操作
Query OK, 1 row affected (0.00 sec)mysql> insert into t1 values (127);
Query OK, 1 row affected (0.01 sec)mysql> insert into t1 values (0);
Query OK, 1 row affected (0.01 sec)mysql> insert into t1 values (-18);
Query OK, 1 row affected (0.02 sec)mysql> insert into t1 values (24);
Query OK, 1 row affected (0.00 sec)mysql> select * from t1;//查看插入结果
+------+
| num  |
+------+
| -128 |
|  127 |
|    0 |
|  -18 |
|   24 |
+------+
5 rows in set (0.00 sec)

当我们创建了一个类型为tinyint类型的表时,发现插入的范围只能是-128~127,如果越界插入则会报错。

错误插入示例:

mysql> insert into t1 values (-129);//越界插入
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1 values (128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1 values (243);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1 values (-548);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from t1;//越界插入的内容不会存到表里
+------+
| num  |
+------+
| -128 |
|  127 |
|    0 |
|  -18 |
|   24 |
+------+
5 rows in set (0.00 sec)

对于无符号的整数tinyint unsigned

mysql> create table t2(-> num tinyint unsigned-> );
Query OK, 0 rows affected (0.01 sec)mysql> insert into t2 values (0);
Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values (255);
Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values (128);
Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values (-1);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values (256);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values (-128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from t2;
+------+
| num  |
+------+
|    0 |
|  255 |
|  128 |
+------+
3 rows in set (0.00 sec)

结果说明

  • 在MySQL中,整形可以指定是有符号的还是无符号的,默认是有符号的。
  • 可以通过unsigned来说明某个字段是无符号的。
  • 其他整数类型和tinyint的使用方法完全相同,差别只在存储数据的大小上。

如果我们向mysql特定的类型中插入不合法的数据,mysql一般是直接拦截我们,不让我们进行操作。反过来,如果我们的数据被成功插入到mysql中了,则数据一定是合法的。
所以,mysql中,数据类型本身也是一种约束。目的是倒逼程序员尽可能正确的插入,另外,如果不是一个很好的使用者的话,mysql也能保证数据的合法性。这使得数据库中的数据是可预期的,完整的。

bit类型

基本语法

bit[M] : 位字段类型,M表示每个值的位数,范围是1~64。如果被忽略,默认为1

使用

mysql> create table t3(-> id int,-> online bit(1)-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t3;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | YES  |     | NULL    |       |
| online | bit(1)  | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)mysql> insert into t3 (id, online) values (123, 0);
Query OK, 1 row affected (0.01 sec)mysql> insert into t3 (id, online) values (122, 1);
Query OK, 1 row affected (0.00 sec)mysql> insert into t3 (id, online) values (122, 3);
ERROR 1406 (22001): Data too long for column 'online' at row 1
mysql> insert into t3 (id, online) values (122, -1);
ERROR 1406 (22001): Data too long for column 'online' at row 1
mysql> select * from t3;
+------+--------+
| id   | online |
+------+--------+
|  123 |        |
|  122 |       |
+------+--------+
2 rows in set (0.00 sec)

注意事项

  1. bit字段在在显示时,默认是按照ASCII码值来显示的,我们想显示的看,可以改成16进制
mysql> select id, hex(online) from t3;
+------+-------------+
| id   | hex(online) |
+------+-------------+
|  123 | 0           |
|  122 | 1           |
+------+-------------+
2 rows in set (0.01 sec)
  1. 验证bit是按照ASCII码值来显示的
mysql> alter table t3 change online online bit(10);
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> insert into t3 (id, online) values (134, 'a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t3 (id, online) values (132, 97);
Query OK, 1 row affected (0.02 sec)mysql> select * from t3;
+------+--------+
| id   | online |
+------+--------+
|  123 |        |
|  122 |       |
|  134 |  a     |
|  132 |  a     |
+------+--------+
4 rows in set (0.00 sec)
  1. 验证bit最多存放64位
mysql> create table t4(-> id int,-> online bit(65)-> );
ERROR 1439 (42000): Display width out of range for column 'online' (max = 64)
mysql> create table t4( id int, online bit(64) );
Query OK, 0 rows affected (0.01 sec)mysql> desc t4;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | YES  |     | NULL    |       |
| online | bit(64) | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

小数类型

float

语法
float[(m,d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间四个字节
使用

float(4,2)表示的范围是-99.99~99.99。mysql在保存float的值的时候会进行四舍五入。

mysql> create table t5(-> id int,-> salary float(4,2)-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t5;
+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| id     | int(11)    | YES  |     | NULL    |       |
| salary | float(4,2) | YES  |     | NULL    |       |
+--------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t5 values(1, 99.99);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(2, -99.99);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(2, -12.34);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(2, 43.21);
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 values(2, 99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t5 values(2, 99.994);
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 values(2, -99.994);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(2, -99.996);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1mysql> select * from t5;
+------+--------+
| id   | salary |
+------+--------+
|    1 |  99.99 |
|    2 | -99.99 |
|    2 | -12.34 |
|    2 |  43.21 |
|    2 |  99.99 |
|    2 | -99.99 |
+------+--------+
6 rows in set (0.00 sec)

float(4,2) unsigned表示的范围是0~99.99。

mysql> create table t6(-> id bigint,-> salary float(4,2) unsigned-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t6;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | bigint(20)          | YES  |     | NULL    |       |
| salary | float(4,2) unsigned | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t6 values(1,99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values(1, 0);
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values(1, -99.99);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t6 values(1, -0.99);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t6 values(1, 99.996);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t6 values(1, 99.994);
Query OK, 1 row affected (0.00 sec)mysql> select * from t6;
+------+--------+
| id   | salary |
+------+--------+
|    1 |  99.99 |
|    1 |   0.00 |
|    1 |  99.99 |
+------+--------+
3 rows in set (0.00 sec)
注意事项
  1. float的默认精度,默认是6位有效数字
mysql> alter table t5 modify salary float;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc t5;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | YES  |     | NULL    |       |
| salary | float   | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t5 values(1, 2435324524.143143123412);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(1, 0.143143123412);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values(1, 3456889470980.14314);
Query OK, 1 row affected (0.00 sec)mysql> select * from t5;
+------+---------------+
| id   | salary        |
+------+---------------+
|    1 |         99.99 |
|    2 |        -99.99 |
|    2 |        -12.34 |
|    2 |         43.21 |
|    2 |         99.99 |
|    2 |        -99.99 |
|    1 |    2435320000 |
|    1 |      0.143143 |
|    1 | 3456890000000 |
+------+---------------+
9 rows in set (0.00 sec)

decimal

语法
decimal(m,d) [unsigned] : 定点m指定长度,d表示小数点的位数
使用

decimal类型在使用时几乎和float类型相同,同样在保存数据的时候,会进行四舍五入。

mysql> create table t7(-> id int,-> salary decimal(4,2)-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t7;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | int(11)      | YES  |     | NULL    |       |
| salary | decimal(4,2) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t7 values(1,99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into t7 values(1,-99.99);
Query OK, 1 row affected (0.01 sec)mysql> insert into t7 values(1,0);
Query OK, 1 row affected (0.01 sec)mysql> insert into t7 values(1,99.994);
Query OK, 1 row affected, 1 warning (0.01 sec)mysql> insert into t7 values(1,99.996);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t7 values(1,-99.996);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t7 values(1,-99.994);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from t7;
+------+--------+
| id   | salary |
+------+--------+
|    1 |  99.99 |
|    1 | -99.99 |
|    1 |   0.00 |
|    1 |  99.99 |
|    1 | -99.99 |
+------+--------+
5 rows in set (0.00 sec)

float 和decimal的比较

floatdecimal在使用的时候几乎相同,但是在保存的数据小数点后的数比较多的时候,float会有精度的损失,decimal没有精度损失,更加准确。

mysql> drop table t7;
Query OK, 0 rows affected (0.00 sec)mysql> create table if not exists t7(-> f1 float(10,8),-> f2 decimal(10,8)-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t7;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| f1    | float(10,8)   | YES  |     | NULL    |       |
| f2    | decimal(10,8) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t7 values(23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)mysql> select * from t7;
+-------------+-------------+
| f1          | f2          |
+-------------+-------------+
| 23.12345695 | 23.12345612 |
+-------------+-------------+
1 row in set (0.00 sec)

float 的默认精度是7位,decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
但是这些结论并不一定准确,mysql的版本不同,结果可能会不同。

结论:
如果需要高精度的数据的话,推荐使用decimal

字符串类型

char

语法

char(L): 固定长度字符串,L是可以存储的长度,单位是字符,最大长度值可以是255

使用

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(11) | YES  |     | NULL    |       |
| name  | char(2) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t8 values (1,'a');
Query OK, 1 row affected (0.01 sec)mysql> insert into t8 values (2,'ab');
Query OK, 1 row affected (0.01 sec)mysql> insert into t8 values (3,'abc');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t8 values (3,'中');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 values (3,'中国');
Query OK, 1 row affected (0.01 sec)mysql> insert into t8 values (3,'中国人');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from t8;
+------+--------+
| id   | name   |
+------+--------+
|    1 | a      |
|    2 | ab     |
|    3 ||
|    3 | 中国   |
+------+--------+
4 rows in set (0.00 sec)

注意事项

  1. char(2)表示存放两个字符,可以是字母或者汉字,但是不能超过两个,
  2. 最多只能是255。
mysql> create table if not exists t9(->id int, ->name char(256) ->);
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use BLOB or TEXT instead

varchar

语法

vatchar(L),可变长度字符串,L表示字符长度,最大长度65535个字节。

是65535个字节,不是65535个字符。

使用

mysql> create table if not exists t9(-> id int,-> name varchar(6)-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t9;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  |     | NULL    |       |
| name  | varchar(6) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t9 values (1,'hello');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9 values (2,'我爱你,中国');
Query OK, 1 row affected (0.01 sec)mysql> insert into t9 values (2,'我爱你,中国!');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from t9;
+------+--------------------+
| id   | name               |
+------+--------------------+
|    1 | hello              |
|    2 | 我爱你,中国       |
+------+--------------------+
2 rows in set (0.00 sec)

注意事项

关于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字节)。
  • 如果在表中还有其他数据,varchar能存储的最大值还可能会因此减少。
mysql> create table t10(-> name varchar(21845)-> );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table t10( name varchar(21844) );
Query OK, 0 rows affected (0.02 sec)mysql> alter table t9 modify name varchar(21845)-> ;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> alter table t9 modify name varchar(21844);
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> alter table t9 modify name varchar(21842);
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

char 和varchar 的比较和选择

在这里插入图片描述
如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  • 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证
  • 最长的能存的进去。定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

日期类型

类型

常用的类型有三个

  • date : 日期格式 'yyyy-mm-dd',占用3个字节。
  • datetime : 日期时间格式'yyyy-mm-dd hh:ii:ss'占用8个字节。
  • timestamp : 时间戳,从1970年一月一号零时开始的。'yyyy-mm-dd hh:ii:ss'格式完全和datetime一致,占用四个字节。

当我们对数据进行增加或者更改的时候, timestamp自动更新为当前的时间。不需要我们手动填写。

使用

mysql> create table if not exists t11(-> t1 date,-> t2 datetime,-> t3 timestamp-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t11;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| t1    | date      | YES  |     | NULL              |                             |
| t2    | datetime  | YES  |     | NULL              |                             |
| t3    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)mysql> insert into t11 (t1,t2) values ('2000-10-01', '1949-10-01 08:00:00');
Query OK, 1 row affected (0.00 sec)mysql> select * from t11;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2000-10-01 | 1949-10-01 08:00:00 | 2025-01-25 23:03:03 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)mysql> update t11 set t1='1999-01-01';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from t11;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 1999-01-01 | 1949-10-01 08:00:00 | 2025-01-25 23:05:03 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

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 votes(-> username varchar(30),-> gender enum('男','女'),-> hobby set('代码','羽毛球','乒乓球','足球','游泳')-> );
Query OK, 0 rows affected (0.01 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.01 sec)mysql> insert into votes values('李四','unknown','乒乓球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1mysql> select * from votes;
+----------+--------+-----------+
| username | gender | hobby     |
+----------+--------+-----------+
| 张三     || 代码      |
| 李四     || 乒乓球    |
+----------+--------+-----------+
2 rows in set (0.00 sec)

注意事项

  1. enum 使用的是下标
mysql> insert into votes values('王五','1','羽毛球');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values('赵六','2','羽毛球');
Query OK, 1 row affected (0.01 sec)mysql> select * from votes;
+----------+--------+-----------+
| username | gender | hobby     |
+----------+--------+-----------+
| 张三     || 代码      |
| 李四     || 乒乓球    |
| 王五     || 羽毛球    |
| 赵六     || 羽毛球    |
+----------+--------+-----------+
4 rows in set (0.00 sec)
  1. set 使用的是位图
mysql> insert into votes values('赵六',1,1);
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values('赵六',1,2);
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values('赵六',1,3);
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+----------+--------+-----------------------------------+
| username | gender | hobby                             |
+----------+--------+-----------------------------------+
| 张三     || 代码                              |
| 李四     || 乒乓球                            |
| 王五     || 羽毛球                            |
| 赵六     || 羽毛球                            |
| 赵六     || 代码,羽毛球,乒乓球,游泳           |
| 赵六     || 代码,羽毛球,乒乓球                |
| 赵六     || 羽毛球,乒乓球,游泳                |
| 赵六     | NULL   | NULL                              |
| 赵六     ||                                   |
| 赵六     || 代码                              |
| 赵六     || 羽毛球                            |
| 赵六     || 代码,羽毛球                       |
+----------+--------+-----------------------------------+
12 rows in set (0.00 sec)
  1. NULL''并不一样,NULL表示没有数据,''表示有数据,只不过数据是空。
mysql> insert into votes (username) values('赵六');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values('赵六',1,'');
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+----------+--------+-----------------------------------+
| username | gender | hobby                             |
+----------+--------+-----------------------------------+
| 张三     || 代码                              |
| 李四     || 乒乓球                            |
| 王五     || 羽毛球                            |
| 赵六     || 羽毛球                            |
| 赵六     || 代码,羽毛球,乒乓球,游泳           |
| 赵六     || 代码,羽毛球,乒乓球                |
| 赵六     || 羽毛球,乒乓球,游泳                |
| 赵六     | NULL   | NULL                              |
| 赵六     ||                                   |
+----------+--------+-----------------------------------+
9 rows in set (0.00 sec)

类型查找

enum查找

既可以使用内容,也可以使用下标

mysql> select * from votes where gender='女';
+----------+--------+-----------+
| username | gender | hobby     |
+----------+--------+-----------+
| 李四     || 乒乓球    |
| 赵六     || 羽毛球    |
+----------+--------+-----------+
2 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     |
+----------+--------+-----------+
| 王五     || 羽毛球    |
| 赵六     || 羽毛球    |
| 赵六     || 羽毛球    |
+----------+--------+-----------+
3 rows in set (0.00 sec)mysql> select * from votes where hobby=3;
+----------+--------+------------------+
| username | gender | hobby            |
+----------+--------+------------------+
| 赵六     || 代码,羽毛球      |
+----------+--------+------------------+
1 row in set (0.00 sec)
函数筛选

集合查询使用find_in_set函数:
find_in_set(sub, str_list):如果 substr_list 中,则返回下标;如果不在,返回0;str_list是用逗号分割的字符串。

mysql> select * from votes where find_in_set('羽毛球',hobby);
+----------+--------+-----------------------------------+
| username | gender | hobby                             |
+----------+--------+-----------------------------------+
| 王五     || 羽毛球                            |
| 赵六     || 羽毛球                            |
| 赵六     || 代码,羽毛球,乒乓球,游泳           |
| 赵六     || 代码,羽毛球,乒乓球                |
| 赵六     || 羽毛球,乒乓球,游泳                |
| 赵六     || 羽毛球                            |
| 赵六     || 代码,羽毛球                       |
+----------+--------+-----------------------------------+
7 rows in set (0.00 sec)mysql> select * from votes where find_in_set('羽毛球',hobby) and find_in_set('代码',hobby);
+----------+--------+-----------------------------------+
| username | gender | hobby                             |
+----------+--------+-----------------------------------+
| 赵六     || 代码,羽毛球,乒乓球,游泳           |
| 赵六     || 代码,羽毛球,乒乓球                |
| 赵六     || 代码,羽毛球                       |
+----------+--------+-----------------------------------+
3 rows in set (0.00 sec)

⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字人+展厅应用方案:开启全新沉浸式游览体验

随着人们生活质量的不断提升,对于美好体验的追求日益增长。在展厅展馆领域,传统的展示方式已难以满足大众日益多样化的需求。而通过将数字人与展厅进行深度结合,可以打造数字化、智能化新型展厅,不仅能提升展示效果,还…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

K8s运维管理平台 - xkube体验:功能较多

目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…

无人机红外热成像:应急消防的“透视眼”

无人机红外热成像:应急消防的“透视眼” 亲爱的小伙伴们,每年一到夏天,应急消防的战士们就像上紧了发条的闹钟,时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨,南北各地还有防洪救灾、台风、泥石流等灾害轮…

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

【C++ 动态规划】1024. 视频拼接|1746

本文涉及知识点 C动态规划 LeetCode1024. 视频拼接 你将会获得一系列视频片段&#xff0c;这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠&#xff0c;也可能长度不一。 使用数组 clips 描述所有的视频片段&#xff0c;其中 clips[i] [starti, end…

EasyExcel写入和读取多个sheet

最近在工作中&#xff0c;作者频频接触到Excel处理&#xff0c;因此也对EasyExcel进行了一定的研究和学习&#xff0c;也曾困扰过如何处理多个sheet&#xff0c;因此此处分享给大家&#xff0c;希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…

电力晶体管(GTR)全控性器件

电力晶体管&#xff08;Giant Transistor&#xff0c;GTR&#xff09;是一种全控性器件&#xff0c;以下是关于它的详细介绍&#xff1a;&#xff08;模电普通晶体管三极管进行对比学习&#xff09; 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管&#xff08;BJT&am…

装饰SpringMVC的适配器实现响应自动包装

文章目录 1.common-tool-starter1.目录结构2.ResultWrapper.java 2.common-web-starter1.目录结构2.IgnoredResultWrapper.java 自定义注解&#xff0c;忽略对返回结果的自动包装3.ReturnValueHandlersDecorator.java 对适配器进行扩展的装饰器4.WebAutoConfiguration.java 将装…

全球AI模型百科全书,亚马逊云科技Bedrock上的100多款AI模型

今天小李哥给大家介绍的是亚马逊云科技上的AI模型管理平台Amazon Bedrock上的Marketplace&#xff0c;这是亚马逊云科技在今年re:Invent发布的一个全新功能&#xff0c;将亚马逊的电商基因带到了其云计算平台&#xff0c;让我们能够通过Amazon Bedrock访问100多种流行、新兴和专…

CentOS7使用源码安装PHP8教程整理

CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…

Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南

由于 Jetson 为 ARM64 (aarch64) 的系统架构&#xff0c;所以不能用 pip install 直接安装&#xff0c;需要通过源码编译。 升级系统 JetPack 由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*&#xff0c;并且 JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2&#xff0…

npm常见报错整理

npm install时报UNMET PEER DEPENDENCY 现象 npm install时报UNMET PEER DEPENDENCY,且执行npm install好几遍仍报这个。 原因 不是真的缺少某个包,而是安装的依赖版本不对,警告你应该安装某一个版本。 真的缺少某个包。 解决 看了下package.json文件,我的react是有的…

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…

“AI质量评估系统:智能守护,让品质无忧

嘿&#xff0c;各位小伙伴们&#xff01;今天咱们来聊聊一个在现代社会中越来越重要的角色——AI质量评估系统。你知道吗&#xff1f;在这个快速发展的时代&#xff0c;产品质量已经成为企业生存和发展的关键。而AI质量评估系统&#xff0c;就像是我们的智能守护神&#xff0c;…

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…

壁纸设计过程中如何增加氛围感

在壁纸设计过程中&#xff0c;增加氛围感是提升整体视觉效果和情感传达的关键。以下是一些具体的方法和技巧&#xff0c;帮助你在设计中营造出强烈的氛围感&#xff1a; 一、色彩运用 选择主题色&#xff1a; 根据你想要传达的情感选择主色调。例如&#xff0c;温暖的色调&…

【学习笔记】深度学习网络-深度前馈网络(MLP)

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…