【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: 0

mysql> 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 1

mysql> 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: 0

mysql> 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: 0

mysql> 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 1

mysql> 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ 定点 new

&#xff08;1&#xff09; 代码距离&#xff1a; #include <new> // 需要包含这个头文件 #include <iostream>int main() {char buffer[sizeof(int)]; // 分配一个足够大的字符数组作为内存池int* p new(&buffer) int(42); // 使用 placement new…

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

一文读懂DeepSeek-R1论文

目录 论文总结 摘要 1. 引言 1.1. 贡献 1.2. 评估结果总结 2. 方法 2.1. 概述 2.2. DeepSeek-R1-Zero&#xff1a;在基础模型上进行强化学习 2.2.1. 强化学习算法 2.2.2. 奖励建模 2.2.3. 训练模板 2.2.4. DeepSeek-R1-Zero 的性能、自我进化过程和顿悟时刻 2.3. …

如何把obsidian的md文档导出成图片,并加上文档属性

上篇关于这个插件PKMer_Obsidian 插件&#xff1a;Export Image plugin 一键将笔记转换为图片分享的文章 如何把obsidian的md文档导出成图片&#xff0c;并加上水印-CSDN博客 如何导出图片的时候让文档属性也显示出来&#xff0c;啊啊&#xff0c;这个功能找了一晚上&#xf…

【javaweb项目idea版】蛋糕商城(可复用成其他商城项目)

该项目虽然是蛋糕商城项目&#xff0c;但是可以复用成其他商城项目或者购物车项目 想要源码的uu可点赞后私聊 技术栈 主要为&#xff1a;javawebservletmvcc3p0idea运行 功能模块 主要分为用户模块和后台管理员模块 具有商城购物的完整功能 基础模块 登录注册个人信息编辑…

pycharm(2)

conda 我下载安装conda的时候产生了各种问题&#xff0c;最终我发现&#xff0c;打开杀毒软件会有阻碍 cuda的版本问题很大&#xff0c;我尝试多个版本之后&#xff0c;发现anaconda3-2024.06.1-windows-x86_64安装了之后不会报错&#xff0c;另外pycharm的版本也一直有问题&a…

【数组OJ】两数之和

两数之和 题目 思路 暴力枚举&#xff1a;逐一遍历&#xff0c;将当前数与之后的数个个相加、判断其相加后是否等于target 代码实现 /*** Note: The returned array must be malloced, assume caller calls free().*///暴力枚举&#xff1a; int* twoSum(int* nums, int nu…

< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对

信息来源&#xff1a; 文件&#xff1a;/var/log/auth.log 因为在 sshd_config 配置文件中&#xff0c;已经定义 LogLevel INFO 部分内容&#xff1a; 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […

Effective Objective-C 2.0 读书笔记—— objc_msgSend

Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…

C# OpenCV机器视觉:车道检测

年关将至&#xff0c;春运的大幕轰轰烈烈地拉开&#xff0c;全国的公路就像一条条汹涌澎湃的 “车河”&#xff0c;各类车辆密密麻麻、川流不息&#xff0c;都朝着家的方向奔腾而去。阿强也裹挟在这归家的大军之中&#xff0c;开着他那辆被塞得满满当当、连后视镜视野都窄了几分…

在win11系统笔记本中使用Ollama部署deepseek制作一个本地AI小助手!原来如此简单!!!

大家新年好啊&#xff0c;明天就是蛇年啦&#xff0c;蛇年快乐&#xff01; 最近DeepSeek真的太火了&#xff0c;我也跟随B站&#xff0c;使用Ollama在一台Win11系统的笔记本电脑部署了DeepSeek。由于我的云服务器性能很差&#xff0c;虽然笔记本的性能也一般&#xff0c;但是…

省级数字经济发展水平数据(2011-2022年)-社科数据

省级数字经济发展水平数据&#xff08;2011-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028602 https://download.csdn.net/download/paofuluolijiang/90028602 数字经济是指以数据资源为关键要素、以现代信息网络为主要载体、以信息…

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…

线程局部存储tls的原理和使用

一、背景 tls即Thread Local Storage&#xff0c;也就是线程局部存储&#xff0c;可在进程内&#xff0c;多线程按照各个线程分开进行存储。对于一些与线程上下文相关的变量&#xff0c;可放到tls中&#xff0c;减少多线程之间的数据同步的开销。 有人可能会问&#xff0c;我…

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…

基于RIP的MGRE VPN综合实验

实验拓扑 实验需求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方&#xff1b; R3与R5之间使用HDLC封…

ROS应用之SwarmSim在ROS 中的协同路径规划

SwarmSim 在 ROS 中的协同路径规划 前言 在多机器人系统&#xff08;Multi-Robot Systems, MRS&#xff09;中&#xff0c;SwarmSim 是一个常用的模拟工具&#xff0c;可以对多机器人进行仿真以实现复杂任务的协同。除了任务分配逻辑以外&#xff0c;SwarmSim 在协同路径规划方…

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…