MySQL 中的 SET 与 ENUM 类型使用详解

2023-11-16

一、SET类型

在创建表时,就指定SET类型的取值范围。

 

  1. 属性名 SET('值1','值2','值3'...,'值n')  

 

其中,“属性名”参数指字段的名称;“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是有64个元素构成的组合,根据成员的不同,存储上也有所不同:

1~8成员的集合,占1个字节。
9~16成员的集合,占2个字节。
17~24成员的集合,占3个字节。
25~32成员的集合,占4个字节。
33~64成员的集合,占8个字节。

同ENUM类型一样,列表中的每个值都有一个顺序排列的编号。MySQL中存入的是这个编号,而不是列表中的值。

插入记录时,SET字段中的元素顺序无关紧要。存入MySQL数据库后,数据库系统会自动按照定义时的顺序显示。如果插入的成员中有重复,则只存储一次。

 

二、ENUM类型

ENUM类型(枚举类型),与C#的概念一样,在定义时指定取值范围。

 

ENUM类型的值范围需要在创建表时通过枚举方式显式指定,对1~255个成员的枚举需要1个字节存储;对于256~65535个成员,需要2个字节存储。最多可以有65535个成员,而SET类型最多只能包含64个成员。两者的取值只能在成员列表中选取。ENUM类型只能从成员中选择一个,而SET类型可以选择多个。

 

因此,对于多个值中选取一个的,可以选择ENUM类型。例如,“性别”字段就可以定义成ENUM类型,因为只能在“男”和“女”中选其中一个。对于可以选取多个值的字段,可以选择SET类型。例如,“爱好”字段就可以选择SET类型,因为可能有多种爱好。 


  1. 属性名 ENUM('值1','值2','值3'...'值n')  

◆其中,属性名参数指字段的名称;“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。列表中的每个值都有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。

◆ENUM 有 NOT NULL 属性,其默认值为取值列表的第一个元素;
◆ENUM 无 NOT NULL,则ENUM类型将允许插入NULL,并且NULL为默认值;

  1. CREATE TABLE Test4(Sex ENUM('男','女'));  
  2. INSERT INTO Test4 VALUES('男');  
  3. INSERT INTO Test4 VALUES('爷');    --这行报错  
  4. SELECT * FROM Test4;  

ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。

 

在下列某些情况下,值也可以是空串('') 或 NULL:

◆如果将一个无效值插入一个 ENUM (即,一个不在允许值列表中的字符串),空字符串将作为一个特殊的错误值被插入。事实上,这个字符串有别于一个'普通的'空字符串,因为这个字符串有个数字索引值为 0。稍后有更详细描述。
◆如果一个 ENUM 被声明为 NULL,NULL 也是该列的一个合法值,并且该列的缺省值也将为 NULL 。如果一个 ENUM 被声明为 NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。

 


每个枚举值均有一个索引值:

◆在列说明中列表值所允许的成员值被从 1 开始编号。
◆空字符串错误值的索引值为 0。这就意味着,你可以使用下面所示的 SELECT 语句找出被赋于无效 ENUM值的记录行。
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
◆NULL 值的索引值为 NULL。

例如,指定为 ENUM('one', 'two', 'three') 的一个列,可以有下面所显示的任一值。每个值的索引值也如下所示:

 

索引值

NULL

NULL

''

0

'one'

1

'two'

2

'three'

3


 

换个枚举最大可以有 65535 个成员值。

从 MySQL 3.23.51 开始,当表被创建时,ENUM 值尾部的空格将会自动删除。

当为一个 ENUM 列赋值时,字母的大小写是无关紧要的。然而,以后从列中检索出来的值的大小写却是匹配于创建表时所指定的允许值。

 

如果在一个数字语境中检索一个ENUM,列值的索引值将被返回。例如,你可以像这样使用数字值检索一个 ENUM 列:
 

  1. mysql> SELECT enum_col+0 FROM tbl_name;  


如果将一个数字存储到一个 ENUM 中,数字被当作为一个索引值,并且存储的值是该索引值所对应的枚举成员。(但是,这在 LOAD DATA 将不能工作,因为它视所有的输入均为字符串。) 在一个 ENUM 字符串中存储数字是不明智的,因为它可能会打乱思维。


ENUM 值依照列规格说明中的列表顺序进行排序。(换句话说,ENUM 值依照它们的索引号排序。)举例来说,对于 ENUM('a', 'b') 'a' 排在 'b' 后,但是对于 ENUM('b', 'a') , 'b' 却排在 'a' 之前。空字符串排在非空字符串前,NULL 值排在其它所有的枚举值前。为了防止意想不到的结果,建议依照字母的顺序定义 ENUM 列表。也可以通过使用 GROUP BY CONCAT(col) 来确定该以字母顺序排序而不是以索引值。


如果希望得到一个 ENUM 列的所有可能值,可以使用:
 

  1. SHOW COLUMNS FROM table_name LIKE enum_colum;  

三、SET 与 ENUM 类型的查询修改操作

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for setenum
-- ----------------------------
DROP TABLE IF EXISTS
 `setenum`;
CREATE TABLE
 `setenum` (
  `id` int(11NOT NULL
 AUTO_INCREMENT,
  `settype` set('we','周','李','孙','钱','赵'DEFAULT NULL
,
  `enumtype` enum('ZZZ','南海','长江','黄河'DEFAULT NULL
,
  PRIMARY KEY
 (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT
 CHARSET=utf8;

-- ----------------------------
-- Records of setenum
-- ----------------------------
INSERT INTO `setenum` VALUES ('1''we,周,钱''南海'
);
INSERT INTO `setenum` VALUES ('2''钱,赵''黄河'
);
INSERT INTO `setenum` VALUES ('3''we,赵''南海'
);
INSERT INTO `setenum` VALUES ('4''李,孙,钱''长江'
);


set('we','周','李','孙','钱','赵')=111111=63

enum('ZZZ','南海','长江','黄河')=100=4

如下表所示:



SET类型:低位(右) → 高位(左)

we

1

1

1

1

1

1

从右到左排:111111=63

 

 

 

 

 

 

we

1

1

0

0

1

0

从右到左排:010011=19

 

 

 

 

 

 

we

0

0

0

0

1

1

从右到左排:110000=48

 

 

 

 

 

 

we

1

0

0

0

0

1

从右到左排:100001=33

 

 

 

 

 

 

we

0

0

1

1

1

0

从右到左排:011100=28



ENUM类型

ZZZ

南海

长江

黄河

1

2

3

4

 

 

 

 

ZZZ

南海

长江

黄河

1

2

3

4

黄河=4=100

 

 

 

 

ZZZ

南海

长江

黄河

1

2

3

4

长江=3=11

 

 

 

 

ZZZ

南海

长江

黄河

1

2

3

4

南海=2=10

 

 

 

 

ZZZ

南海

长江

黄河

1

2

3

4

ZZZ=1=1




mysql> select * from setenum;
+
----+----------+----------+
| id | settype  | enumtype |
+
----+----------+----------+
|  1
 | we,周,钱 | 南海     |
|  2
 | 钱,赵    | 黄河     |
|  3
 | we,赵    | 南海     |
|  4
 | 李,孙,钱 | 长江     |
+
----+----------+----------+
4 rows in set


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum;
+
----------+-----------+----------------+----------+------------+-----------------+
| settype  | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
----------+-----------+----------------+----------+------------+-----------------+
| we,周,钱 |        19 | 10011          | 南海     |          2 | 10
              |
| 钱,赵    |        48 | 110000         | 黄河     |          4 | 100
             |
| we,赵    |        33 | 100001         | 南海     |          2 | 10
              |
| 李,孙,钱 |        28 | 11100          | 长江     |          3 | 11
              |
+
----------+-----------+----------------+----------+------------+-----------------+
4 rows in set


mysql> select * from setenum where settype=33;
+
----+---------+----------+
| id | settype | enumtype |
+
----+---------+----------+
|  3
 | we,赵   | 南海     |
+
----+---------+----------+
1 row in set


mysql> select * from setenum where enumtype=2;
+
----+----------+----------+
| id | settype  | enumtype |
+
----+----------+----------+
|  1
 | we,周,钱 | 南海     |
|  3
 | we,赵    | 南海     |
+
----+----------+----------+
2 rows in set


--不支持二进制查询
mysql> select * from setenum where settype=b'010011'
;
Empty set


mysql> select * from setenum where settype=b'10011';
Empty set


mysql> select * from setenum where enumtype=b'100';
Empty set



mysql> SELECT * FROM setenum WHERE settype LIKE '%赵%';
+
----+---------+----------+
| id | settype | enumtype |
+
----+---------+----------+
|  2
 | 钱,赵   | 黄河     |
|  3
 | we,赵   | 南海     |
+
----+---------+----------+
2 rows in set


--与FIND_IN_SET函数同
mysql> SELECT * FROM setenum WHERE FIND_IN_SET('赵',settype)>0
;
+
----+---------+----------+
| id | settype | enumtype |
+
----+---------+----------+
|  2
 | 钱,赵   | 黄河     |
|  3
 | we,赵   | 南海     |
+
----+---------+----------+
2 rows in set



--当查询只是集合某个值的一部分时,与FIND_IN_SET函数不同
mysql> SELECT * FROM setenum WHERE FIND_IN_SET('e',settype)>0
;
Empty set


mysql> SELECT * FROM setenum WHERE settype LIKE '%e%';
+
----+----------+----------+
| id | settype  | enumtype |
+
----+----------+----------+
|  1
 | we,周,钱 | 南海     |
|  3
 | we,赵    | 南海     |
+
----+----------+----------+
2 rows in set



mysql> SELECT * FROM setenum WHERE settype LIKE '赵';
Empty set


mysql> SELECT * FROM setenum WHERE settype = '赵';
Empty set


mysql> SELECT * FROM setenum WHERE settype LIKE 'we,赵';
+
----+---------+----------+
| id | settype | enumtype |
+
----+---------+----------+
|  3
 | we,赵   | 南海     |
+
----+---------+----------+
1 row in set


mysql> SELECT * FROM setenum WHERE settype = 'we,赵';
+
----+---------+----------+
| id | settype | enumtype |
+
----+---------+----------+
|  3
 | we,赵   | 南海     |
+
----+---------+----------+
1 row in set



--如果把集合的顺序改一下,照样无效
mysql> SELECT * FROM setenum WHERE settype LIKE '赵,we'
;
Empty set


mysql> SELECT * FROM setenum WHERE settype = '赵,we';
Empty set




mysql> SELECT * FROM setenum WHERE enumtype LIKE '%海%';
 
+
----+----------+----------+
| id | settype  | enumtype |
+
----+----------+----------+
|  1
 | we,周,钱 | 南海     |
|  3
 | we,赵    | 南海     |
+
----+----------+----------+
2 rows in set


mysql> SELECT * FROM setenum WHERE enumtype = '南海';
+
----+----------+----------+
| id | settype  | enumtype |
+
----+----------+----------+
|  1
 | we,周,钱 | 南海     |
|  3
 | we,赵    | 南海     |
+
----+----------+----------+
2 rows in set


mysql> SELECT * FROM setenum WHERE enumtype = '海';
Empty set




--------------------UPDATE 语法--------------------

set('we','周','李','孙','钱','赵')=111111=63

mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
----------+-----------+----------------+----------+------------+-----------------+
| settype  | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
----------+-----------+----------------+----------+------------+-----------------+
| we,周,钱 |        19 | 10011          | 南海     |          2 | 10
              |
+
----------+-----------+----------------+----------+------------+-----------------+
1 row in set


mysql> update setenum set settype = 2 where id=1;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
---------+-----------+----------------+----------+------------+-----------------+
| settype | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
---------+-----------+----------------+----------+------------+-----------------+
| 周      |         2 | 10             | 南海     |          2 | 10
              |
+
---------+-----------+----------------+----------+------------+-----------------+
1 row in set


--修改settype让其'we'、'周'、'李' 成员为真
mysql> update setenum set settype =settype|1|4|6 where id=1
;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


--|1|4|6 表示 二进制的OR运算 1 or 100 or 110 = 111 = 7
--实际与 1|6 结果是一样的:1 or 110 = 111 = 7

we

1

1

1

0

0

0

从右到左排:000111=7



mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
----------+-----------+----------------+----------+------------+-----------------+
| settype  | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
----------+-----------+----------------+----------+------------+-----------------+
| we,周,李 |         7 | 111            | 南海     |          2 | 10
              |
+
----------+-----------+----------------+----------+------------+-----------------+
1 row in set


--实际与 1|6 结果是一样的:1 or 110 = 111 = 7
mysql> update setenum set settype =settype|1|6 where id=1
;
Query OK, 0 rows
 affected
Rows matched: 1  Changed: 0  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
----------+-----------+----------------+----------+------------+-----------------+
| settype  | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
----------+-----------+----------------+----------+------------+-----------------+
| we,周,李 |         7 | 111            | 南海     |          2 | 10
              |
+
----------+-----------+----------------+----------+------------+-----------------+
1 row in set



--settype|1|6 的settype 可以省略,结果一样
mysql> update setenum set settype = 1|6 where id=1
;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
----------+-----------+----------------+----------+------------+-----------------+
| settype  | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
----------+-----------+----------------+----------+------------+-----------------+
| we,周,李 |         7 | 111            | 南海     |          2 | 10
              |
+
----------+-----------+----------------+----------+------------+-----------------+
1 row in set



-- &表示与运算,1 and 110 = 0,注意0与NULL不同
mysql> update setenum set settype = 1 & 6 where id=1
;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
---------+-----------+----------------+----------+------------+-----------------+
| settype | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
---------+-----------+----------------+----------+------------+-----------------+
|         |         0 | 0              | 南海     |          2 | 10
              |
+
---------+-----------+----------------+----------+------------+-----------------+
1 row in set



-- &表示与运算,~表示反运算,6=110,~6=001,1 and 001 = 1
mysql> update setenum set settype = null where id=1
;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
---------+-----------+----------------+----------+------------+-----------------+
| settype | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
---------+-----------+----------------+----------+------------+-----------------+
NULL    | NULL      | NULL           | 南海     |          2 | 10
              |
+
---------+-----------+----------------+----------+------------+-----------------+
1 row in set


mysql> update setenum set settype = 1 & ~6 where id=1;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
---------+-----------+----------------+----------+------------+-----------------+
| settype | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
---------+-----------+----------------+----------+------------+-----------------+
| we      |         1 | 1              | 南海     |          2 | 10
              |
+
---------+-----------+----------------+----------+------------+-----------------+
1 row in set




-- 5 and ~1 = 101 and ~1 = 101 and 111110 = 100 = 4
mysql> update setenum set settype = null where id=1
;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0


mysql> update setenum set settype = 5 & ~1 where id=1;
Query OK, 1 row
 affected
Rows matched: 1  Changed: 1  Warnings: 0

we

0

0

1

0

0

0

从右到左排:000100=4



mysql> select settype,settype+0,bin(settype+0),enumtype,enumtype+0,bin(enumtype+0from setenum where id=1;
+
---------+-----------+----------------+----------+------------+-----------------+
| settype | settype+0 | bin(settype+0) | enumtype | enumtype+0 | bin(enumtype+0
) |
+
---------+-----------+----------------+----------+------------+-----------------+
| 李      |         4 | 100            | 南海     |          2 | 10
              |
+
---------+-----------+----------------+----------+------------+-----------------+
1 row in set







enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 最大的问题。所以。。安心点啦。干脆点直接tinyint。

单曲观点:
    我觉得没什么优点,对数字型的enum,简直就是梦魇,boolean  tinyint(1) 0,1 status  tinyint(1)  1,2,3,4,5,6..tinyint欢淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出现膘哥所说的混淆。

简单观点:
   少用,一般都是用tinyint替代。

天枫观点:
   我觉得除了状态直观  没什么优点,我一般直接int,tinyint([1or2or3]) 到底有啥区别?(后面会简单探讨下,这里面的1or2or3区别。)

中庸观点:
   a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号,基本上是不加引号的。

竖琴螺观点:
   六种情况就:tinyint(1)  -1,-2,1,2,3,4

上面各种观点重点集中在PHP这种弱类型语言对引号不重视,程序员不写容易引起插入的语句不是自己想要的结果的问题,容易出现int时没有用引号导致插入了新值而不是定的那个值:

表结构如下: 

?
1
2
3
4
5
CREATE TABLE `enum2tinyint` (
  `switchs` enum( 'none' , 'success' , 'fail' , 'delete' , 'skip' , '1' ) DEFAULT NULL ,
  `switch` tinyint(1) NOT NULL ,
  KEY `switchs` (`switchs`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 
正常带引号插入enum: 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES ( '1' , '1' );
1 1

PHP的弱类型问题,特别是对int类型的情况,实践如下: 
如果没有带引号插入enum字段后如下(是第一个值none): 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (1, '1' );
none 1

如果没有带引号插入enum字段后如下(是第2个值success): 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (2, '1' );
success 1


结论:要插入enum的值,字段必须加引号,不加引号当然是数字,数字就是key,不是value。

规劝:
1)enum是整型这样的错误很容易发生,尤其是php弱类型的,一般新来一个人,没注意enum类型,就会犯错。
2)数据库说明清楚的话,或者可选择的全是字符串的话,还没什么,但是里面有数字,难免有新手犯错,养成加引号的习惯很重要。

最终结论:
历史原因,要把enum改成tinyint程序改动太大了,用了的没必要改·~,以后新建的时候,尽量使用tinyint就好。
这种字段的重复内容过多的,索引建不建,关系不大,这种在mysql叫索引的势太低,其查询效果不太好:(英文是这么翻译的:https://justwinit.cn/post/1405/)。
————————————————————————————————————————————————————————————————————
tinyint(1)和tinyint(4)一样的,都是-127到128或者0到256。unsigned属性全是正,和c语言unsigned int有点类似:
tinyint(1)   -128 ~ 127
tinyint(1) unsigned  0 ~ 255

为何表示的最大正数比最小负数的绝对值少1呢?
第一位是符号位,1表示负数
所以负数可以到128,正数只能到127
-128正127
如:0111 1111  正数  ,负数 1111 1111

提问:

Mysql里int(1)和int(11)差别很大的,mysql的int,有个属性 ,UNSIGNED ZEROFILL  后面的ZEROFILL,就是有定义的位数不够则用零补齐对齐一下(这儿可能涉及到索引的性能罢):int,  长度(M)=5, 属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),00001,00002。

但这个tinyint呢,tinyint(1)和tinyint(4)一样的?

看这文章后:http://www.jb51.net/article/53424.htm

我估计:mysql这块对一个字节不像int这种四个字节要进行对其前部分进行部分字节索引,如果说tinyint(1)和tinyint(4)是一样的表示范围情况下,但mysql对tinyint数字长度位数作了可设置的限定,从理论上说其存在硬盘里的字节是不一样才是合乎逻辑的,这块估计还是为了对字节进行对齐方便索引等,以提升效率为主罢,l如:ike keyword%    索引有效,如果统一对齐,索引效果会不会更好呢?我也只是猜测。
————————————————————————————————————————————————————————————————————

在网上找了下这个enum的mysql的大体实现如下:

一)enum的存储原理我仔细查看了下手册。是这样的:
在建立这个字段时,我们会给他规定一个范围比如enum('a','b','c'),这时mysql内部会建立一张hash结构的map表,类似:0000 -> a,0001 -> b,0002 -> c。
当我插入一条数据,此字段的值位a或b或c时,他存储在里面的不是这个字符,而是对应他的索引,也就是那个0000或0001或0002。
同样,enum在mysql手册上的说明:
ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)
除非enum的个数超过了一定数量,否则他所占的存储空间也总是1字节。

二)tinyint:
类型  字节  最小值  最大值
      (带符号的/无符号的)  (带符号的/无符号的)
TINYINT  1  -128  127
他的最小存储所占空间也是1字节。

最后,Enum,既然要用它,就不必要使用什么0,1,2来代替实际的字符串了。甚至中文字符串。他并不会对数据库性能进行多余开销。因为对于它来说,你使用'0','1','2'和'张三','李四','王五'数据表所占的存储空间一样。但是考虑到我们实际应用时数据需要从db服务器回传到web app,所以在网络传输时,当然还是尽可能的传输小数据比较好。所以如果很在意这些,还是不用它好了。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 中的 SET 与 ENUM 类型使用详解 的相关文章

  • 使用 Python 2.7 和 MySQLdb 将二进制数据插入 MySQL 中的 blob 列时如何避免编码警告

    我在将二进制数据插入到longblob使用 Python 2 7 中的 MySQLdb 在 MySQL 中的列 但我收到一个编码警告 我不知道如何解决 test py 11 Warning Invalid utf8 character st
  • MySQL 创建和更新时的 CURRENT_TIMESTAMP

    我想定义一个有 2 个 TIMESTAMP 字段的表 如下所示 CREATE TABLE msgs id INT PRIMARY KEY AUTO INCREMENT msg VARCHAR 256 ts create TIMESTAMP
  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 在 ASP.NET MVC 中使用 MySQL 的 AccountController

    在 Visual Studio 中创建默认的 ASP NET MVC 项目会设置一个可以在其中注册用户的基本项目 我将如何继续更改它以使用 MySQL 服务器而不是 SQLServer 现在可以使用了 安装最新的 Connector NET
  • 语言翻译语法

    我正在尝试为我的项目添加另一种语言 我们知道语言可以表现出主语和谓语的差异 例如 英语 Mustafa和他的朋友去看电影ahmet today 土耳其 Mustafa布昆 阿卡达西ahmetile birlikte sinemaya git
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • MySQL 触发器和 SUM()

    我有两张桌子 学生桌和家庭桌 在学生中 我有列 st venue 和total venue 家里我有收入 Total Revenue 是学生 st 收入与家庭收入之和 其中 family id student student id stud
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • Sql:计算随时间的增长

    我几周前发布了这个问题 但我认为我没有清楚地提出这个问题 因为我得到的答案不是我想要的 我认为最好重新开始 我正在尝试查询数据库以检索一段时间内唯一条目的数量 数据看起来像这样 Day UserID 1 A 1 B 2 B 3 A 4 B
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 我可以在一个查询中更新/选择表吗?

    我需要在查看页面时选择数据并更新 视图 列 有没有一种方法可以在一个查询中执行此操作 或者我是否必须使用不同的查询 如果您不想 不需要使用事务 则可以创建一个存储过程 该过程首先更新视图计数 然后选择值并将其返回给用户
  • 如何在Sequelize中从主模型同一级别的包含模型返回结果?

    这是我在项目中完成的代码和结果 我想获得包含模型的结果与主模型相同的结果 下面的代码是我所做的 序列化查询 User findAll include model Position attributes POSITION NAME then
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我

随机推荐

  • WPF InkCanvas 基础使用教程

    大家好 由于很多原因 我有很长一段时间没有在 CSDN 上分享我的学习成果了 如今终于可以回归分享之路了 之前在做一个项目的时候 想在一个区域里绘制自己的图形 于是上网搜索资料 无意中找到了 InkCanvas 但我们最终并没有在项目里使用
  • mvp基类抽取

  • Linux 获取内存和CPU使用率

    ifndef SYS FUNC H define SYS FUNC H int GetMemInfo int pTotal int pUsed int GetCpuUsedRate int pValue endif include sys
  • 220920python学习:变量、运算符和分支结构

    220920python学习 变量 运算符和分支结构 一 变量 变量的作用 保存数据 程序中使用数据的方式 在需要数据时直接提供数据 先将数据保存到变量中 然后在需要使用数据的时候通过变量来提供数据 需要多次打印或使用同一个数据 用变量最便
  • 优化(2)——射线检测基础,合批原理

    射线检测 射线响应的方法 首先获取到canvas下所有graphic组件 当前的ui元素是否接收射线 第一个if判断是否绘制到屏幕上 是否勾选RaycastTarget接受射线 是否进行了剔除 第二个if判断点击是否在当前对象上 第三个判断
  • 【问题记录】python 命令行启动 http server 在局域网内从浏览器下载

    一 安装 python 要确保本机或服务器安装 python 二 查看本机 服务器的 ip 地址 命令 ifconfig 可以查找 ipv4z 字段 例如 172 16 0 12 如果是服务器起的话 就不用查看 ip 了 直接就是服务器 i
  • 华为云存储空间图库占比太大_华为手机照片太多?放这里既安全又不占内存,瞬间腾出50G空间...

    现在的手机拍照功能越来越强大 很多人都习惯在旅游出行 聚餐吃饭时用手机拍照记录自己的生活 久而久之手机相册就存储了一大堆图片 占用大量的手机内存 怎么办呢 通常的做法就是定期删减一些不必要的图片 但是这样太麻烦了 有没有方法可以将这些手机照
  • maven环境变量配置,总不成功,你就这样试试

    我下载了maven 解压后的目录为 配置了用户变量为下图 然后配置系统的path变量如下图 配置完后我也重启了系统 但是还是显示为下图 这是怎么回事 我进入 bin 下执行命令就没问题 说明程序好好的 但是这个怎么就是不成功呢 分享到 举报
  • 实例分割之SOLOv2: Dynamic, Faster and Stronger

    论文 代码 SOLOv2为作者对SOLO的改进 采用动态卷积核生成实例掩码 若对SOLO不了解 可先戳这里 作者取名为Dynamic head 将SOLO中的Mask Branch改为kernel branch和feature branch
  • ubuntu下nfs服务安装

    操作系统 ubuntu22 04 2 一 服务端安装与配置 1 在服务端安装nfs服务端组件 sudo apt install nfs kernel server 2 创建共享目录share并且授权所有人可以访问 sudo mkdir sh
  • 物联网全栈教程-从云端到设备(一)

    一 2016年的时候 我还在学校里面准备着毕业论文 当时做的课题是预测一个挖掘机上面的一个继电器的寿命 我们的想法是检测其吸合的次数 然后根据吸合的次数来预计其寿命 这个想法很简单 因为一个继电器失效之前通常会正常吸合一定的次数比如10W次
  • 【错误】IDEA :Windows找不到文件“chrome”。请确定文件名是否正确,再试一次

    idea运行前端页面的时候 遇到错误找不到浏览器位置 首先确认的就是地址没找到 那么需要我们手动添加一下 找到浏览器 查看属性复制它的全路径 在回到idea中然后在IDEA里面 File gt setting gt Web Browsers
  • EMC整改小技巧

    EMC整改小技巧 差模干扰与共模干扰 差模干扰 存在于L N线之间 电流从L进入 流过整流二极管正极 再流经负载 通过热地 到整流二极管 再回到N 在这条通路上 有高速开关的大功率器件 有反向恢复时间极短的二极管 这些器件产生的高频干扰 都
  • 浏览器会因为什么样的脚本而崩溃

    浏览器可能因为以下几种情况而崩溃 无限循环 如果JavaScript脚本包含一个无限循环 浏览器将无法停止脚本的执行 导致浏览器不响应甚至崩溃 例如 以下代码会导致无限循环 while true 无限循环 内存泄漏 如果JavaScript
  • Java关键字--------final关键字

    final关键字 final关键字表示最终的 不可修改的 final关键字可以用来修饰类 方法和属性 1 final关键字修饰属性 被final关键字修饰的属性的值和类型都不能再改变 就属于常量 只能做一次赋值 被final修饰的属性通常与
  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式 在 XILINX 中有许多原语 常见的差分转单端 IBUFDS 单端转差分 OBUFDS IBUFG
  • SO_LINGER选项

    SO LINGER选项 SO LINGER选项用于控制close系统调用在关闭TCP连接时的行为 默认情况下 当我们使用close系统调用来关闭一个socket时 close将立即返回 TCP模块负责把该socket对应的TCP发送缓冲区中
  • 代理IP与网络安全在跨境电商中的关键作用

    跨境电商已成为全球商业的重要组成部分 然而 随之而来的网络安全问题也日益凸显 为了在海外市场取得成功 不仅需要优质的商品和服务 还需要稳定 安全的网络连接 本文将介绍如何运用Socks5代理IP技术解决这些挑战 1 代理IP与网络安全 网络
  • [技术讨论]PT100采样电路设计

    本来不论PT100还是PT1000 他们的采样电路网上都很多 而且之前直接用的是现成的MAX31865方案 奈何领导说太贵 用集成运放搭吧 领导动动嘴 属下跑断腿 于是各方论坛 度娘 终于整了个有希望的方案 仅以此文记述这段硬件方案设计的经
  • MySQL 中的 SET 与 ENUM 类型使用详解

    一 SET类型 在创建表时 就指定SET类型的取值范围 sql view plain copy 属性名 SET 值1 值2 值3 值n 其中 属性名 参数指字段的名称 值n 参数表示列表中的第n个值 这些值末尾的空格将会被系统直接删除 其基