【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.rhkb.cn/news/8364.html

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

相关文章

深度剖析C++17中的std::optional:处理可能缺失值的利器

文章目录 一、基本概念与设计理念二、构建与初始化(一)默认构造(二)值初始化(三)使用std::make_optional(四)使用std::nullopt 三、访问值(一)value()&#x…

云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持

一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…

[BSidesCF 2020]Had a bad day1

题目 这里有传参 文件包含使用伪协议读取flag 先读取index.php查看 /index.php?categoryphp://filter/readconvert.base64-encode/resourceindex 解码 index.php源码 <?php$file $_GET[category];if(isset($file)){if( strpos( $file, "woofers" ) ! false …

12 款开源OCR发 PDF 识别框架

2024 年 12 款开源文档解析框架的选型对比评测&#xff1a;PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章&#xff0c;聚焦于智能文档处理&#xff08;特别是 PDF 解析&#xff09;。无论是在模型预训练的数据收集阶段&#xff0c;还是基于 RAG…

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API&#xff1a;防止欺诈交易的有力武器 随着互联网的发展&#xff0c;电子支付方式也越来越普及。在支付过程中&#xff0c;银行卡是最常用的支付工具之一。然而&#xff0c;在一些支付场景中&#xff0c;需要对用户的银行卡信息进行验证&#xff0c;以确保支…

Lite.Ai.ToolKit - 一个轻量级的 C++ 工具包

&#x1f6e0;**Lite.Ai.ToolKit**&#xff1a;一个轻量级的 C 工具包&#xff0c;包含 100 个很棒的 AI 模型&#xff0c;例如对象检测、人脸检测、人脸识别、分割、遮罩等。请参阅 Model Zoo 和 ONNX Hub、MNN Hub、TNN Hub、NCNN Hub。 3700 Stars 711 Forks 0 Issues 6 贡献…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

读书笔记--分布式服务架构对比及优势

本篇是在上一篇的基础上&#xff0c;主要对共享服务平台建设所依赖的分布式服务架构进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。随着企业各业务数字化转型工作的推进&#xff0c;之前在传统的单一系统&#xff08;或单体应用&#xff09;模式中&#…

基于ADS的电感和变压器的建模过程

1. 电感二端口建模 对于固定尺寸单圈电感&#xff0c;从0.5G-200GHz的仿真&#xff0c;并提取其模型 如果想要在50GHz前把模型建准&#xff0c;仿真可能要建到200G&#xff0c;因为需要高频的数据&#xff0c;频率越高信息也越多。首先要调用文件由于数据是存在一个文件夹里面的…

使用Maxscript定义纹理贴图的方法

在3ds Max中,MaxScript 是一种用于插件编写和自动化任务的强大工具。通过MaxScript,你可以创建和操作对象、材质、灯光等等。要为材质分配纹理贴图,你可以按照以下方法来编写脚本。直接代码: myBmp = bitmaptexture filename:"D:\map001.tga" meditmaterials[1]…

初阶数据结构:链表(二)

目录 一、前言 二、带头双向循环链表 1.带头双向循环链表的结构 &#xff08;1)什么是带头&#xff1f; (2)什么是双向呢&#xff1f; &#xff08;3&#xff09;那什么是循环呢&#xff1f; 2.带头双向循环链表的实现 &#xff08;1&#xff09;节点结构 &#xff08;2…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(九)(完结篇)

文章目录 一、成绩查询模块实现1、学生成绩查询功能实现1.1 页面设计1.2 前端页面实现1.3 后端功能实现2、成绩分段查询功能实现2.1 页面设计2.2 前端页面实现2.3 后端功能实现二、试卷练习模块实现三、我的分数模块实现1、 页面设计2、 前端页面实现3、 后端功能实现四、交流区…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D&#xff1a;\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g&#xff0c;如提示no input files 则说明Mingw64 安装成功&#xff0c;如果提示g 不是内…

爱的魔力转圈圈,基于carsim与simulink模拟仰望u8原地调头

仰望U8原地转向的示意图如下&#xff0c;不动方向盘的情况下&#xff0c;车可以自己转圈圈&#xff1a; 原理也很简单&#xff0c;仰望u8是四轮驱动&#xff0c;四个轮子都单独由四个轮边电机驱动。主要我们将左右的车轮轮速控制成左右两边轮速相同&#xff0c;但是方向相反&am…

1.1第1章DC/DC变换器的动态建模-1.1状态平均的概念--电力电子系统建模及控制 (徐德鸿)--读书笔记

电力电子系统一般由电力电子变换器&#xff08;滤波电路和开关&#xff09;、PWM 调制器、驱动电路、反馈控制单元构成&#xff0c;如图1-1所示。由控制理论的知识&#xff0c;电力电子系统的静态和动态性能的好坏与反馈控制设计密切相关。要进行反馈控制设计&#xff0c;首先要…

6. 使用springboot做一个音乐播放器软件项目【1.0版项目完结】附带源码~

#万物OOP 注意&#xff1a; 本项目只实现播放音乐和后台管理系统。 不分享任何音乐歌曲资源。 上一篇文章我们 做了音乐播放器后台的功能。参考地址&#xff1a; https://jsonll.blog.csdn.net/article/details/145214363 这个项目已经好几天也没更新了&#xff0c;因为临近放…

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息&#xff0c;目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块&#xff1a;进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

豆包MarsCode:字符串字符类型排序问题

问题描述 思路分析 我们需要对字符串中的字母、数字、问号按照规则进行排序&#xff0c;具体要求是&#xff1a; 问号的位置不变。数字的位置不变&#xff0c;但数字之间要按照从大到小排序。字母的位置不变&#xff0c;但字母之间要按照字典序排序。 解决此问题的思路分为以…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

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

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