【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 | 大文本,不支持全文索引,不支持默认值 | |
日期类型 | ||
date | yyyy-mm-dd,具体到天 | |
datetime | yyyy-mm-dd hh:mm:ss具体到秒 | |
timestamp | 时间戳 | |
String类型 | ||
enum | enum是一个字符串对象,其值来自表创建时在列规定中显示枚举的一个列值。 | |
set | set是一个字符串对象,可以有零或者多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样的set成员值本身不能包含逗号。 |
数值类型
tinyint类型
tinyint
、smallint
、int
、bigint
四个整数类型操作基本相同,不同之处只有存储的数据大小不同。我们以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)
注意事项
bit
字段在在显示时,默认是按照ASCII
码值来显示的,我们想显示的看,可以改成16进制
mysql> select id, hex(online) from t3;
+------+-------------+
| id | hex(online) |
+------+-------------+
| 123 | 0 |
| 122 | 1 |
+------+-------------+
2 rows in set (0.01 sec)
- 验证
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)
- 验证
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)
注意事项
- 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的比较
float
和decimal
在使用的时候几乎相同,但是在保存的数据小数点后的数比较多的时候,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)
注意事项
- char(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)
注意事项
- 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)
- 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)
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)
:如果 sub
在 str_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)
⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!