mysql 数据类型

目录

数值类型

整数

tinyint

位类型

BIT(M)

浮点类型

float [(M, D)] [UNSIGNED]

DECIMAL(M, D) [UNSIGNED]

二进制类型

字符型

CHAR(SIZE)

VARCHAR(SIZE)

日期类型

DATE/DATETIME/TIMESTAMP

string 类型

SET & ENUM


在前面的文章中,有时候茶树数据我们会看到我们插入了一些数据,这些数据都是由自己的类型,而且这些数据类型都是有差别的,今天来看一下数据类型。

分类数据类型说明
BIT(M)位类型。指定位数,默认值1,范围1-64
TINYINT [UNSIGNED]带符号的范围-128~127,无符号范围0~255.默认有符号
BOOL使用0和1表示真和假
SMALLINT [UNSIGNED]带符号是-2~15次方到215-1,无符号是216-1
数值类型INT [UNSIGNED]带符号是-231次方到2~31-1,无符号是2~32-1
BIGINT [UNSIGNED]带符号是-2~63次方到263-1无符号是2~64-1
FLOAT [(M, D)] [UNSIGNED]M指定显示长度,d指定小数位数,占用4字节
DOUBLE [(M, D)] [UNSIGNED]表示比float精度更大的小数,占用空间8字节
DECIMAL (M, D) [UNSIGNED]定点数M指定长度,D表示小数点的位数
CHAR(SIZE)固定长度字符串,最大255
文本,二进制类型VARCHAR(SIZE)可变长度字符串,最大长度65535
BLOB二进制数据
TEXT进制数据
时间类型DATE/DATETIME/TIMESTAMP日期类型(yyyy-mm-dd)(yyyy-mm-dd hh:mm:ss)timestamp时间戳
ENUM 类型期类型(yyyy-mm-dd)(yyyy-mm-dd hh:mm:ss)timestamp时间戳
string 类型SET 类型SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样set成员值本身不能包含逗号。

上面是整体的数据类型,我们会挑部分介绍。

数值类型

整数

tinyint

首先我们先看一下整数类型里面的 tinyint, 它占用一个字节,并且还是有符号整型,所以它的范围就是 -128~127之间,如果是 unsigned 的话,那么就是 0~255。

创建一个表,该表里面有一个 tinyint 类型:

mysql> create table t1(-> num tinyint);
Query OK, 0 rows affected (0.01 sec)
​
mysql> desc t1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| num   | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

下面我们尝试插入数据,看一下插入各种数据的情况:

插入范围内数据:

mysql> insert into t1(num) values(0);
Query OK, 1 row affected (0.00 sec)
​
mysql> insert into t1(num) values(-128);
Query OK, 1 row affected (0.00 sec)
​
mysql> insert into t1(num) values(127);
Query OK, 1 row affected (0.00 sec)

查看插入的数据:

mysql> select * from t1;
+------+
| num  |
+------+
|    0 |
| -128 |
|  127 |
+------+
3 rows in set (0.00 sec)

上面的数据都插入成功了,那么下面插入不在范围内的数据查看情况:

mysql> insert into t1(num) values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1(num) values(-129);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t1(num) values(200);
ERROR 1264 (22003): Out of range value for column 'num' at row 1

其实在这里看到报错信息我们也知道1没有插入进去,报错信息显示超出范围,所以如果不在范围内的数据之间就报错,不能插入。

其实上面的超出数据范围就不能插入也算是 mysql 的一种约束,也就是数据类型的约束。

现在继续创建一个表里面的爱护据类型是 unsigned tinyint:

mysql> create table t2(-> num tinyint unsigned);
Query OK, 0 rows affected (0.00 sec)
​
mysql> show tables;
+---------------------+
| Tables_in_test_type |
+---------------------+
| t1                  |
| t2                  |
+---------------------+
2 rows in set (0.00 sec)

插入数据:

mysql> insert into t2(num) values(0);
Query OK, 1 row affected (0.01 sec)
​
mysql> insert into t2(num) values(255);
Query OK, 1 row affected (0.00 sec)

上面插入范围内的数据都插入成功了,下面插入负数或者大于255:

mysql> insert into t2(num) values(256);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2(num) values(-1);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2(num) values(-128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1

这里插入超出了范围的数据都失败了。

在整型里面我们就看这一个,其他的整型都和这个也是差不多的,只是可以存储数据的范围不同。

位类型

BIT(M)

bit表示就是比特位,后面的 M 表示该比类型有多少个比特位,其中M 的取值范围是 1 ~ 64。

创建一个拥有 BIT 类型的表:

mysql> create table t3(-> num BIT(1));
Query OK, 0 rows affected (0.01 sec)
mysql> desc t3;
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| num   | bit(1) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)

这里创建成功了,其中这里的 type的类型就是 bit 后面的括号就是1 表示只有一个比特位。

插入数据:

mysql> insert into t3(num) values(1);
Query OK, 1 row affected (0.00 sec)mysql> insert into t3(num) values(0);
Query OK, 1 row affected (0.00 sec)

这里插入 1 0 都成功了,下面插入其他的值:

mysql> insert into t3(num) values(2);
ERROR 1406 (22001): Data too long for column 'num' at row 1
mysql> insert into t3(num) values(-1);
ERROR 1406 (22001): Data too long for column 'num' at row 1
mysql> insert into t3(num) values(3);
ERROR 1406 (22001): Data too long for column 'num' at row 1

由于只有一个比特位,所以只能插入1 或者 0,如果插入其他的值就会超出,所以不能插入。

现在我们将该类型修改为 BIT(10)然后插入数据:

mysql> alter table t3 modify num BIT(10);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

修改成功后继续插入数据:

mysql> insert into t3(num) values(2);
Query OK, 1 row affected (0.01 sec)mysql> insert into t3(num) values(-1);
ERROR 1406 (22001): Data too long for column 'num' at row 1
mysql> insert into t3(num) values(3);
Query OK, 1 row affected (0.01 sec)

这里看到除了 -1 不能插入其余的都插入进入了,这里因为 BIT 没有负数类型,不能插入。

那么这里看一下该表里面存储的值是什么:

mysql> select  * from t3;
+------+
| num  |
+------+
|     |
|      |
|     |
|     |
+------+
4 rows in set (0.00 sec)

这里看到好像什么都没有,但是实际上 BIT 里面的数据是按照ASCII表来的,由于ASCII前面的都是不可显的,所以这里看不到,我们可以插入 a 看一下,或者插入 97 看是否是 a:

mysql> insert into t3(num) values('a');
Query OK, 1 row affected (0.01 sec)mysql> select * from t3;
+------+
| num  |
+------+
|     |
|      |
|     |
|     |
|  a   |
+------+
5 rows in set (0.00 sec)mysql> insert into t3(num) values(97);
Query OK, 1 row affected (0.01 sec)mysql> select * from t3;
+------+
| num  |
+------+
|     |
|      |
|     |
|     |
|  a   |
|  a   |
+------+
6 rows in set (0.00 sec)

这里看到我们说的和结果是相同的。

浮点类型

float [(M, D)] [UNSIGNED]

float 里面可以存除是浮点数,其中M表示该浮点数最长可以存多少位,D表示小数点进度到多少位,而且float也是可以带 UNSIGNED 的。

其中 float(4, 2) 就表示,该类型的数据范围是 -99.99 ~ 99.99.

下面创建一个有 float 类型的表:

mysql> create table t4(-> num float(4, 2));
Query OK, 0 rows affected (0.01 sec)

查看该表结构:

mysql> desc t4;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| num   | float(4,2) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

我们看到 type 的类型就是刚才创建的,为了验证刚才说的数据范围,我们插入数据看一下:

mysql> insert into t4(num) values(99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into t4(num) values(-99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into t4(num) values(0);
Query OK, 1 row affected (0.00 sec)

已经插入了,看一下结果:

mysql> select *  from t4;
+--------+
| num    |
+--------+
|  99.99 |
| -99.99 |
|   0.00 |
+--------+
3 rows in set (0.00 sec)

这里看到都已经插入成功了,包括刚才我们插入的 0 也已经被补齐为了有两位小数。

插入不在范围内的数据:

mysql> insert into t4(num) values(100.00);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(-100.00);
ERROR 1264 (22003): Out of range value for column 'num' at row 1

这里看到没有插入成功,下面继续插入不在范围内的数据,只是这次插入我们多插入几位小数:

ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(-99.999);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(-99.998);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(-99.995);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(-99.994);
Query OK, 1 row affected (0.00 sec)

这里看到我们插入最后一次尽然插入成功了,那么我们继续插入:

mysql> insert into t4(num) values(99.999);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(99.996);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t4(num) values(99.994);
Query OK, 1 row affected (0.00 sec)

我们看到也是最后一次插入成功了,那么我们插入中间值,插入多位小数:

mysql> insert into t4(num) values(50.555);
Query OK, 1 row affected (0.00 sec)mysql> insert into t4(num) values(50.554);
Query OK, 1 row affected (0.01 sec)mysql> insert into t4(num) values(50.556);
Query OK, 1 row affected (0.00 sec)

插入成功查看数据:

mysql> select * from t4;
+--------+
| num    |
+--------+
|  99.99 |
| -99.99 |
|   0.00 |
| -99.99 |
|  99.99 |
|  50.55 |
|  50.54 |
|  50.55 |
|  50.55 |
|  50.56 |
+--------+
10 rows in set (0.01 sec)

这里看到,最后我们超出范围的小数如果大于5则会进一位,小于等于5则不会进位。但是在边界的时候又是四舍五入原则。

下面我们创建一个 float(4, 2) UNSIGNED 的表:

mysql> create table t5(-> num float(4, 2) unsigned);
Query OK, 0 rows affected (0.00 sec)mysql> desc t5;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| num   | float(4,2) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

我们同样插入数据:

mysql> insert into t5(num) values(99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into t5(num) values(0);
Query OK, 1 row affected (0.00 sec)

上面插入成功了,下面看一下插入更大的值:

mysql> insert into t5(num) values(100.00);
ERROR 1264 (22003): Out of range value for column 'num' at row 1

这里看到插入 100 后结果失败了,所以对于 float 的 unsigned 来说,无符号整型只是将负数的取值去掉了,并没有对正数这边增加取值范围。

实际上 float 的精度并不高,如果插入较大的数据,那么里面的值会和插入的值不相符,下面创建一个默认的 float 表:

mysql> create table t6(-> num float);
Query OK, 0 rows affected (0.00 sec)mysql> desc t6;
+-------+-------+------+-----+---------+-------+
| Field | Type  | Null | Key | Default | Extra |
+-------+-------+------+-----+---------+-------+
| num   | float | YES  |     | NULL    |       |
+-------+-------+------+-----+---------+-------+
1 row in set (0.00 sec)

下面插入较大的数据看一下:

mysql> insert into t6(num) values(1234567.1234);
Query OK, 1 row affected (0.00 sec)
mysql> select * from  t6;
+---------+
| num     |
+---------+
| 1234570 |
+---------+
1 row in set (0.00 sec)

这里看到进度就丢失了,其实 float 的进度一般在7位,所以为了存储更精确的数据,还有一个数据类型看下面。

DECIMAL(M, D) [UNSIGNED]

decimal 的 M 和 D 和 float 的是相同的意思,同样也有 unsigned,但是 decimal 的精度远高于 float,decimal 的精度为65位。

由于其他的都和float是一样的,所以这里就不测试其他的了,这里只看一下他们的精度区别。

下面创建一个既有 float(10, 8) 也有 decimal(10, 8) 的数据类型的表,然后插入较大的数据:

mysql> create table t7(-> num1 float(10, 8),-> num2 decimal(10, 8));
Query OK, 0 rows affected (0.01 sec)mysql> desc t7;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| num1  | float(10,8)   | YES  |     | NULL    |       |
| num2  | decimal(10,8) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

插入数据:

mysql> insert into t7(num1, num2) values(12.12345678, 12.12345678);
Query OK, 1 row affected (0.00 sec)mysql> select * from t7;
+-------------+-------------+
| num1        | num2        |
+-------------+-------------+
| 12.12345695 | 12.12345678 |
+-------------+-------------+
1 row in set (0.00 sec)

插入成功后,这里看到里面的数据 float 已经不准确了,但是 decimal 更为准确,所以如果需要数据特别准确的话还是需要用 decimal 来存储。

二进制类型

字符型

CHAR(SIZE)

char 类型后面的 size 表示该类型能存储size 个字符,下面创建一个拥有 char 类型的表:

mysql> create table t8(-> sentence char(2));
Query OK, 0 rows affected (0.01 sec)mysql> desc t8;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| sentence | char(2) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

这里创建了一个 char(2) 表示可以存储两个字符,那么现在插入数据看一下:

mysql> insert into t8(sentence) values('a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8(sentence) values('ab');
Query OK, 1 row affected (0.00 sec)

插入 a 和 ab 都成功了,那么继续插入abc看能否成功:

mysql> insert into t8(sentence) values('abc');
ERROR 1406 (22001): Data too long for column 'sentence' at row 1

插入 abc 就失败了,因为 abc 超出了连个字符,那么下面插入汉字:

mysql> insert into t8(sentence) values('中');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8(sentence) values('中国');
Query OK, 1 row affected (0.00 sec)

这里看到即使插入“中国”也成功了,”中国“在 utf8 编码下可以占用6个字节,但是Mysql 这里用的并不是字节来表示,而是字符,所以“中国”还是算两个字符。

我们修改一下 char 的类型,看一下最大能存储多少个字符:

mysql> alter table t8 modify sentence char(500);
ERROR 1074 (42000): Column length too big for column 'sentence' (max = 255); use BLOB or TEXT instead

这里想要修改为 500 但是修改失败,显示最多只能是 255,所以 char 最多只能存储 255个字符。

VARCHAR(SIZE)

其实还有一种数据类型和 CHAR 是基本一样的,但是 VARCHAR 是变长字符串,那么他们究竟有什么区别?

在存储的时候,我们基本看不出来区别,我们可以试一下:

mysql> create table t9(-> sentence varchar(2));
Query OK, 0 rows affected (0.00 sec)mysql> desc t9;
+----------+------------+------+-----+---------+-------+
| Field    | Type       | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
| sentence | varchar(2) | YES  |     | NULL    |       |
+----------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

创建好后插入数据看一下:

mysql> insert into t9(sentence) values('a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9(sentence) values('ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9(sentence) values('中');
Query OK, 1 row affected (0.00 sec)mysql> insert into t9(sentence) values('中国');
Query OK, 1 row affected (0.00 sec)mysql> select * from t8;
+----------+
| sentence |
+----------+
| a        |
| ab       |
| 中       |
| 中国     |
+----------+
4 rows in set (0.00 sec)mysql> select * from t9;
+----------+
| sentence |
+----------+
| a        |
| ab       |
| 中       |
| 中国     |
+----------+
4 rows in set (0.01 sec)

这里看到正常使用是一样的,但是他们的本质的区别还是有的。

假设现在有一个 char(30) 和 varchar(30),并且里面都存储了10个字符,但是 char 用掉的空间是在 utf8 下每一个字符是3字节所以用掉了90字节,但是varchar确实变长的,只用掉所占用的空间。

而且varchar 的最大是 65535 字节,所以如果按照 utf8 存储那么 varchar 最高可以存储 65535/3 字符,而 char 只能存储 255 字符,下面我们看一下。

我们将 sentence修改为 verchar(21845) ,因为 65535/3 等于 21845 ,所以varchar存储 utf8编码下可以存储 21845字符。

mysql> alter table t9 modify sentence varchar(65535);
ERROR 1074 (42000): Column length too big for column 'sentence' (max = 21845); use BLOB or TEXT instead

这里先开辟大于 21845 这里显示只能是 21845,那么下面开辟 21845看一下:

mysql> alter table t9 modify sentence 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

但是这里我们开辟 21845 看到也是不可以,为什么?

这里因为 varchar 是变长的,所以还需要 1~ 3字节来存储当前的个数,所以正真能存储的个数是 (65535 - 3)/ 3

所以是 21844.

mysql> alter table t9 modify sentence varchar(21844);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

这里修改为 21844 就成功了,但是其实mysql 是在表的每一行存储,而表的每一行最多存储 65535 字节,所以如果该表还有其他列的话,那么 varchar 其实正真存储的字符在 utf8 下还要小于 21844。

日期类型

DATE/DATETIME/TIMESTAMP

  • date类型:xxxx-yy-zz

  • datetime:xxxx-yy-zz HH:MM:SS

  • timestamp:时间戳,但是和 datetime 的格式相同

这次就一起说了,将这三个类型,创建一个表同时包含这三种类型:

mysql> create table t10(-> d1 date,-> d2 datetime,-> d3 timestamp);
Query OK, 0 rows affected (0.01 sec)mysql> desc t10;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| d1    | date      | YES  |     | NULL              |                             |
| d2    | datetime  | YES  |     | NULL              |                             |
| d3    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)

这里的 timestamp 是一个时间戳,在插入的时候不需要插入,而是会自己插入。

mysql> insert into t10(d1, d2) values('2000-11-11', '1945-10-9 12:11:59');
Query OK, 1 row affected (0.00 sec)mysql> select * from t10;
+------------+---------------------+---------------------+
| d1         | d2                  | d3                  |
+------------+---------------------+---------------------+
| 2000-11-11 | 1945-10-09 12:11:59 | 2023-08-21 18:28:25 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

其中,我们跟新这条数据的时候时间戳也会自动跟新:

mysql> update t10 set d1='2023-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from t10;
+------------+---------------------+---------------------+
| d1         | d2                  | d3                  |
+------------+---------------------+---------------------+
| 2023-01-01 | 1945-10-09 12:11:59 | 2023-08-21 18:32:48 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

这里看到也是跟新了。

string 类型

SET & ENUM

这里也就将 set(集合) 和 enum(枚举) 一起说了。

创建一个表里面包含 set 和 enum 类型:

mysql> create table votes(-> name varchar(12),-> sex enum('男', '女', '保密'),-> hobby set('玩游戏', '听音乐', '踢足球', '游泳', '羽毛球'));
Query OK, 0 rows affected (0.01 sec)
mysql> desc votes;
+-------+---------------------------------------------------------------+------+-----+---------+-------+
| Field | Type                                                          | Null | Key | Default | Extra |
+-------+---------------------------------------------------------------+------+-----+---------+-------+
| name  | varchar(12)                                                   | YES  |     | NULL    |       |
| sex   | enum('男','女','保密')                                        | YES  |     | NULL    |       |
| hobby | set('玩游戏','听音乐','踢足球','游泳','羽毛球')               | YES  |     | NULL    |       |
+-------+---------------------------------------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

这里创建完成后,我们开始插入数据:

mysql> insert into votes(name, sex, hobby) values('张三', '男', '玩游戏');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes(name, sex, hobby) values('李四', '男', '游泳');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes(name, sex, hobby) values('小红', '保密', '游泳');
Query OK, 1 row affected (0.00 sec)

插入成功,查看插入数据:

mysql> select * from votes;
+--------+--------+-----------+
| name   | sex    | hobby     |
+--------+--------+-----------+
| 张三   | 男     | 玩游戏    |
| 李四   | 男     | 游泳      |
| 小红   | 保密   | 游泳      |
+--------+--------+-----------+
3 rows in set (0.00 sec)

那么如果插入 enum 里面没有的数据呢?

mysql> insert into votes(name, sex, hobby) values('猴子', '***', '游泳');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> insert into votes(name, sex, hobby) values('猪八戒', '***', '游泳');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

都插入失败了,那么插入set 没有的数据呢?

mysql> insert into votes(name, sex, hobby) values('猴子', '男', '五行山');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> insert into votes(name, sex, hobby) values('猪八戒', '男', '高老庄');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

也是失败了。

其中enum 插入除了可以用里面的内容也可以用数字:

mysql> insert into votes(name, sex, hobby) values('猪八戒', '1', '玩游戏');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes(name, sex, hobby) values('猪八戒', '2', '玩游戏');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes(name, sex, hobby) values('猪八戒', '3', '玩游戏');
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+-----------+
| name      | sex    | hobby     |
+-----------+--------+-----------+
| 张三      | 男     | 玩游戏    |
| 李四      | 男     | 游泳      |
| 小红      | 保密   | 游泳      |
| 猪八戒    | 男     | 玩游戏    |
| 猪八戒    | 女     | 玩游戏    |
| 猪八戒    | 保密   | 玩游戏    |
+-----------+--------+-----------+
6 rows in set (0.00 sec)

这里看到也是可以的,那么 set 可不可以这样插入呢?

mysql> insert into votes(name, sex, hobby) values('猪八戒', '3', '1');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes(name, sex, hobby) values('猪八戒', '3', '2');
Query OK, 1 row affected (0.00 sec)mysql> select * from votes;
+-----------+--------+-----------+
| name      | sex    | hobby     |
+-----------+--------+-----------+
| 张三      | 男     | 玩游戏    |
| 李四      | 男     | 游泳      |
| 小红      | 保密   | 游泳      |
| 猪八戒    | 男     | 玩游戏    |
| 猪八戒    | 女     | 玩游戏    |
| 猪八戒    | 保密   | 玩游戏    |
| 猪八戒    | 保密   | 玩游戏    |
| 猪八戒    | 保密   | 听音乐    |
+-----------+--------+-----------+
8 rows in set (0.00 sec)

这里看到set 插入 1 和 2 也插入到对应的内容上了我们继续插入:

mysql> insert into votes(name, sex, hobby) values('沙和尚', '3', '3');
Query OK, 1 row affected (0.00 sec)mysql> insert into votes(name, sex, hobby) values('沙和尚', '3', '4');
Query OK, 1 row affected (0.01 sec)mysql> select * from votes;
+-----------+--------+---------------------+
| name      | sex    | hobby               |
+-----------+--------+---------------------+
| 张三      | 男     | 玩游戏              |
| 李四      | 男     | 游泳                |
| 小红      | 保密   | 游泳                |
| 猪八戒    | 男     | 玩游戏              |
| 猪八戒    | 女     | 玩游戏              |
| 猪八戒    | 保密   | 玩游戏              |
| 猪八戒    | 保密   | 玩游戏              |
| 猪八戒    | 保密   | 听音乐              |
| 沙和尚    | 保密   | 玩游戏,听音乐       |
| 沙和尚    | 保密   | 踢足球              |
+-----------+--------+---------------------+
10 rows in set (0.01 sec)

这里看到插入 3 结果不是踢足球,插入 4 才是踢足球,为什么呢?

其实set用数字插入实际用的是该数字的二进制位,如果对应的二进制位为 1则插入,否则没有。

所以该 set 对应的就是 00000 所以想要全部插入需要插入 31:

mysql> insert into votes(name, sex, hobby) values('唐僧', '3', '31');
Query OK, 1 row affected (0.01 sec)mysql> select * from votes;
+-----------+--------+------------------------------------------------+
| name      | sex    | hobby                                          |
+-----------+--------+------------------------------------------------+
| 张三      | 男     | 玩游戏                                         |
| 李四      | 男     | 游泳                                           |
| 小红      | 保密   | 游泳                                           |
| 猪八戒    | 男     | 玩游戏                                         |
| 猪八戒    | 女     | 玩游戏                                         |
| 猪八戒    | 保密   | 玩游戏                                         |
| 猪八戒    | 保密   | 玩游戏                                         |
| 猪八戒    | 保密   | 听音乐                                         |
| 沙和尚    | 保密   | 玩游戏,听音乐                                  |
| 沙和尚    | 保密   | 踢足球                                         |
| 唐僧      | 保密   | 玩游戏,听音乐,踢足球,游泳,羽毛球               |
+-----------+--------+------------------------------------------------+
11 rows in set (0.00 sec)

那么入过想要查找呢?我们想查找有玩游戏的人:

mysql> select * from votes where hobby='玩游戏';
+-----------+--------+-----------+
| name      | sex    | hobby     |
+-----------+--------+-----------+
| 张三      | 男     | 玩游戏    |
| 猪八戒    | 男     | 玩游戏    |
| 猪八戒    | 女     | 玩游戏    |
| 猪八戒    | 保密   | 玩游戏    |
| 猪八戒    | 保密   | 玩游戏    |
+-----------+--------+-----------+
5 rows in set (0.00 sec)

虽然上面的查询语句中 where 是匹配而等于就是完全匹配。

但是这里找到的是只有 玩游戏,而我们想要的是有玩游戏的人,那么该怎么查找呢?

这里介绍一个函数 find_in_set() 下面先做一个简单的测试:

在 'a,b,c'中查找测试:

mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set('b', 'a,b,c');
+---------------------------+
| find_in_set('b', 'a,b,c') |
+---------------------------+
|                         2 |
+---------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,b', 'a,b,c');
+-----------------------------+
| find_in_set('a,b', 'a,b,c') |
+-----------------------------+
|                           0 |
+-----------------------------+
1 row in set (0.00 sec)

通过上面的测试,我们发现 find_in_set 只能查找一个字符,所以我们下面查找有玩游戏的人:

mysql> select  * from votes where find_in_set('玩游戏', hobby);
+-----------+--------+------------------------------------------------+
| name      | sex    | hobby                                          |
+-----------+--------+------------------------------------------------+
| 张三      | 男     | 玩游戏                                         |
| 猪八戒    | 男     | 玩游戏                                         |
| 猪八戒    | 女     | 玩游戏                                         |
| 猪八戒    | 保密   | 玩游戏                                         |
| 猪八戒    | 保密   | 玩游戏                                         |
| 沙和尚    | 保密   | 玩游戏,听音乐                                  |
| 唐僧      | 保密   | 玩游戏,听音乐,踢足球,游泳,羽毛球               |
+-----------+--------+------------------------------------------------+
7 rows in set (0.00 sec)

那么我们想找有玩游戏和听音乐的呢?find_in_set 只能查找一个呀,怎么办?

mysql> select  * from votes where find_in_set('玩游戏', hobby)  and find_in_set('听音乐', hobby);
+-----------+--------+------------------------------------------------+
| name      | sex    | hobby                                          |
+-----------+--------+------------------------------------------------+
| 沙和尚    | 保密   | 玩游戏,听音乐                                  |
| 唐僧      | 保密   | 玩游戏,听音乐,踢足球,游泳,羽毛球               |
+-----------+--------+------------------------------------------------+
2 rows in set (0.00 sec)

其中 where 语句像 if 一样可以连续判断,中间需要加 and。

其他的数据类型其实也都差不多,这里主要介绍这些常用的,剩下的可以自己下去测试一下~

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

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

相关文章

【校招VIP】CSS校招考点之选择器优先级

考点介绍: 选择器是CSS的基础,也是校招中的高频考点,特别是复合选择器的执行优先级,同时也是实战中样式不生效的跟踪依据。 因为选择器的种类较多,很难直接记忆,可以考虑选择一个相对值,比如id类…

人大进仓数据库ksql命令基础

测试环境信息: 系统为银河麒麟V10 数据库为Kingbase ES V8 数据库安装目录为/opt/Kingbase/ES/V8 ksql命令位于/opt/Kingbase/ES/V8/Server/bin下 使用--help获取帮助 续上图 1.查看数据库列表 ./ksql -U system -l 2.查看数据库版本 ./ksql -V 3.连接指定的数据库tes…

如何写一个简单的dockerfile

Dockerfile 是一种文本文档,它包含了一组用户可以调用以创建镜像的指令。用户可以使用 docker build 命令,根据 Dockerfile 中定义的步骤,自动构建出一个新的 Docker 镜像。 以下是一些常用的 Dockerfile 指令: FROM&#xff1a…

python 条件编译如何写

在Python中,条件编译通常是通过预处理指令来实现的。与其他编程语言不同,Python没有像C或C那样的预处理器,但您可以使用一些技巧来模拟条件编译的效果。以下是一种在Python中模拟条件编译的常见方法: # 定义一个条件变量&#xf…

springboot使用mybatis配置多数据源

概述 配置多数据源有两种方案。一种是使用dynamic依赖的DS注解的方法,这种是比较简单方便的方法。另一种是本文介绍的方式,配置不同数据源的SqlSessionFactory 。 第二种方法是我在开发一个老项目时,老项目配置的方法。 application.xml s…

投资人热捧的创业大赛,有哪些AI原生应用值得关注?

“绝对远超全球同类产品”,一位大模型创业者对百度文心一言的表现不吝夸奖。 这是一家生产效率工具创业公司的负责人,今年5月百度发起大模型领域创业比赛——“文心杯”,他率先报名参赛并入选决赛文心创业营,目前与其他30多家入围…

【GAMES202】Real-Time Shadows2—实时阴影2

一、PCSS回顾 上一篇我们说了如何用PCSS是实现软阴影,这个过程是没有任何问题的,但是有一个速度的问题,因为PCSS涉及到非常多次对纹理特定某一块区域遍历的操作(工业界一般都是用在该区域采样的方式,会因此产生噪声&am…

常见gis几何格式(wkt、geojson、arcgis json)的转换方法

1.相关链接 https://github.com/terraformer-js/terraformer 2.arcgis geometry json与geojson互转 Convert ArcGIS JSON geometries to GeoJSON geometries and vice versa. npm install terraformer/arcgis (1)arcgis geometry json转换成geojson格…

Zookeeper集群单节点启动成功但未同步其他节点数据

首先排查节点启动是否正常: 在zookeeper的bin目录下执行:sh zkServer.sh status 判断当前节点数据leader 还是follower 节点都启动正常,但某一个zookeeper集群节点(下面简称“异常节点”)不同步其他节点数据&#xf…

SQL-每日一题【1321. 餐馆营业额变化增长】

题目 表: Customer 你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。 计算以 7 天(某日期 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。 结果按 …

最新两年工作经验总结

最新两年工作经验总结 前言URP的使用1:如何开启URP1、老项目升级为URP2、创建新项目时选择URP创建 2:URP阴影的设置 PolyBrush的使用(地图编辑插件)制作山峰or低谷边缘柔化雨刷上色制造场景中的物体贴图地形创建容易踩坑的点ProBu…

飞天使-k8sv1.14二进制安装

文章目录 安装前准备安装前设置分发脚本 开始安装k8s集群cfssl 安装部署kubectl命令行工具创建admin证书和私钥创建kubeconfig文件部署ETCD集群部署Flannel网络kube-apiserver 高可用KeepLived 部署部署master节点部署高可用kube-controller-manager集群kube-controller-manage…

C++ namespace对全局变量屏蔽的工程化意义解读

namespace解决了什么&#xff1f; 解决了变量的跨域访问问题C解决了C语言不能访问全局变量的问题 #include<iostream> using namespace std;namespace glo{ int global 50; }int main(int argc, char *argv[]) {int global 20;std::cout << global << en…

java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发 em

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显…

【C++习题集】-- 堆

&#xff08;用于复习&#xff09; 目录 树概念及结构 名词概念 二叉树概念及结构 特殊的二叉树 满二叉树 完全二叉树 运算性质 二叉树存储结构 顺序存储 链式存储 堆 - 顺序存储 堆的性质 堆的实现 堆的应用 堆排序 直接建堆法 树概念及结构 概念&#xff1a…

编写Dockerfile制作自己的镜像并推送到私有仓库

说明&#xff1a;我将用到的私有仓库是Harbor&#xff0c;安装教程参考我的这一篇文章&#xff1a; 安装搭建私有仓库Harbor_Word_Smith_的博客-CSDN博客 一、案例1 1、要求 编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私…

【算法题】7004. 判别首字母缩略词

题目&#xff1a; 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s &#xff0c;则认为 s 是 words 的首字母缩略词。例如&#xff0c;“ab” 可以由 [“a…

【2023】LeetCode HOT 100——哈希

目录 1. 两数之和1.1 C++实现1.2 Python实现1.3 时空分析2. 字母异位词分组2.1 C++实现2.2 Python实现2.3 时空分析3. 最长连续序列3.1 C++实现3.2 Python实现3.3 时空分析1. 两数之和 🔗 原题链接:1. 两数之和 不妨设 i

电子商务防火墙的作用

1.作为网络安全的屏障 只有经过精心选择的应用协议才能通过防火墙&#xff0c;可使网络环境变得更安全。如 防火墙可以禁止 NFS 协议进出受保护的网络&#xff0c;这样外部的攻击者就不可能利用这些 脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击&am…

【高级IO】- 五种 IO 模型 | 多路转接 - select

目录 IO的基本概念 什么是高效的IO&#xff1f; 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 同步通信VS异步通信&#xff08;synchronous communication / asynchronous communication&#xff09; 同步通信VS同步与互斥 阻塞VS非阻塞 其他高级IO …