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

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

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

你可能感兴趣的:(mysql,android)