1、类型属性

1.1 unsigned

简而言之就是将数字无符号化,与 C、C++里的 unsigned 含义相同

1.2 zerofill

设置了这个属性以后,如果存储的内容的宽度小于指定的宽度,则自动填充0。比如下面这个案例:

1
2
3
4
5
6
7
8
mysql> create table t (a int(10) zerofill);
mysql> insert into t select 1;
mysql> select a,hex(a) from t;
+------------+--------+
| a          | hex(a) |
+------------+--------+
| 0000000001 | 1      |
+------------+--------+

注意:如果列设置了 zerofill 属性,则会自动加上 unsigned

1
2
3
4
5
6
mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

2、SQL_MODE设置

我也是最近遇到几次报错了才开始注意这个设置的。

2.1 查看设置情况

全局的配置

1
2
3
4
5
6
mysql> select @@global.sql_mode;
+------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------+

当前会话

1
2
3
4
5
6
mysql> select @@session.sql_mode;
+------------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------+

2.2 设置方法

mysqld 运行期间生效,重启失效

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql> set global sql_mode='STRICT_TRANS_TABLES';
mysql> select @@global.sql_mode\G
*************************** 1. row ***************************
@@global.sql_mode: STRICT_TRANS_TABLES
#  session 
mysql> select @@session.sql_mode;
+------------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------+

修改配置文件

1
2
[mysqld]
sql_mode='STRICT_TRANS_TABLES'

2.3 可以设置的项目

2.3.1 strict_trans_tables

在该模式下,如果一个值不能插入到一个事务表(比如表的存储引擎是 InnoDB)中,则中断当前的操作不影响非事务表(例如表的存储引擎为 MyISAM)。 也就是说一个操作中可以同时操作事务类型和非事务类型的表,启用该模式后,出错时事务表回滚,非事务表继续执行成功。

2.3.2 allow_invalid_dates

该选项并不完全对日期的合法性进行校验,只是检查月份是否在1~12之间,日期是否在1~31之间。该模式仅对 date 和 datetime 类型有效,对 timestamp 无效。

2.3.3 ansi_quotes

启用该模式后,不能使用双引号来引用字符串,因为它将被解释为识别符。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
mysql> create table t (a varchar(32));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t select "aaaaa";
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> set sql_mode='ansi_quotes';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> insert into t select "bbbb";
ERROR 1054 (42S22): Unknown column 'bbbb' in 'field list'

mysql> insert into t select 'bbbb';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

2.3.4 error_for_division_by_zero

在 insert 或者 update 过程中,如果数据被零除(或者 mod(x,0)),则产生错误,否则产生警告。如果未设置该模式,那么数据被零除时 MySQL 返回 null。 如果用到 insert ignore 或者 update ignore 中,MySQL 生成被零除警告,但是操作结果为 null。

2.3.5 high_not_precedence

操作符的优先顺序是表达式。例如,not a between b and c 被解释为 not (a between b and c),在一些旧版本中,前面的表达式被解释为 (not a) between b and c。启用该模式以后,可以获得以前旧版本的更高优先级的结果。

1
2
3
4
5
6
mysql> select 0 between -1 and 1;
+--------------------+
| 0 between -1 and 1 |
+--------------------+
|                  1 |
+--------------------+

由于0在-1和1之间,所以返回了1,如果加上 not 呢。

1
2
3
4
5
6
mysql> select not 0 between -1 and 1;
+------------------------+
| not 0 between -1 and 1 |
+------------------------+
|                      0 |
+------------------------+

如果启用high_not_precedence模式,则select not 0 between -1 and 1被解释为select (not 0) between -1 and 1,执行结果将会不一样。

1
2
3
4
5
6
7
8
9
mysql> set sql_mode='high_not_precedence';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select not 0 between -1 and 1;
+------------------------+
| not 0 between -1 and 1 |
+------------------------+
|                      1 |
+------------------------+

2.3.6 ignore_space

函数名和括号“(”之间有空格。好像没什么好处,要访问保存为关键字的数据库、表或列名,必须应用这个选项。例如某个表中有 user 这一列,而 MySQL 数据库中又有 user 这个函数,此时 user 会被解释为函数,如果想要选择 user 这一列,则需要引用。

2.3.7 no_auto_create_user

禁止 grant 创建密码为空的用户。

2.3.8 no_auto_value_on_zero

该选项影响列为自动增长的插入。在默认设置下,插入0或 null代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

2.3.9 no_backslash_escapes

反斜杠”"作为普通字符而非转义符。

2.3.10 no_dir_in_create

在创建表时忽视所有的 index directorydata directory 的选项。

2.3.11 no_engine_substitution

如果需要的存储引擎被禁用或未编译,那么抛出错误。默认用默认的存储引擎替代,并抛出一个异常。

2.3.12 no_unsigned_subtraction

启用这个选项后两个 unsigned 类型相减返回 signed 类型。

2.3.13 no_zero_date

在非严格模式下,可以插入"0000-00-0000:00:00"的非法日期,MySQL 数据库仅抛出一个警告。而启用该选项后,MySQL 数据库不允许插入零日期,插入零日期会抛出错误而非警告。

2.3.14 no_zero_in_date

在严格模式下,不允许日期和月份为0。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
mysql> set sql_mode='no_zero_in_date';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> select @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| NO_ZERO_IN_DATE    |
+--------------------+
mysql> create table a (a datetime);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into a select '2020-03-00';
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 1

竟然插入的时候没有任何错误提示,但是库里的数据是不对的。可能跟 MySQL 的版本有关吧。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mysql> select * from a;
+---------------------+
| a                   |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.26    |
+-----------+

2.3.15 only_full_group_by

对于 group by 聚会操作,如果在 select 中的列没有在 group by 中出现,那么这个 sql 会报错。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql> set sql_mode='only_full_group_by';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| ONLY_FULL_GROUP_BY |
+--------------------+
mysql> select * from sc group by cid;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'study.sc.sid' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

但是当这个表只有一列的时候,不会报错

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mysql> select * from t;
+-------+
| a     |
+-------+
| aaaaa |
| bbbb  |
+-------+
2 rows in set (0.00 sec)

mysql> select * from t group by a;
+-------+
| a     |
+-------+
| aaaaa |
| bbbb  |
+-------+

2.3.16 pad_char_to_full_length

对于 char 类型字段,不要截断空洞数据。空洞数据就是自动填充值为0x20的数据。看下面的案例

1
2
3
4
5
6
7
8
mysql> create table b (a char(10));
mysql> insert into b select 'a';
mysql> select a, char_length(a), hex(a) from b;
+------+----------------+--------+
| a    | char_length(a) | hex(a) |
+------+----------------+--------+
| a    |              1 | 61     |
+------+----------------+--------+

可以看出,在默认情况下,虽然 a 列是 char 列,但是返回的长度是1,因为 MySQL 数据库对后面的空洞数据进行了截断。若启用pad_char_to_full_length选项, 则反映的是实际存储的内容。

1
2
3
4
5
6
7
mysql> set sql_mode='pad_char_to_full_length';
mysql> select a, char_length(a), hex(a) from b;
+------------+----------------+----------------------+
| a          | char_length(a) | hex(a)               |
+------------+----------------+----------------------+
| a          |             10 | 61202020202020202020 |
+------------+----------------+----------------------+

2.3.17 pipes_as_concat

将"||"视为字符串的连接操作符而非运算符,和字符串的拼接函数 concat 类似。

1
2
3
4
5
6
7
mysql> set sql_mode="pipes_as_concat";
mysql> select 'a'||'b'||'c';
+---------------+
| 'a'||'b'||'c' |
+---------------+
| abc           |
+---------------+

2.3.18 real_as_float

将 real 视为 float 的同义词,而不是 double。

2.3.19 strict_all_tables

对所有引擎的表都启用严格模式。strict_trans_tables 只对支持事务的表启用严格模式。
在严格模式下,一旦任何操作的数据产生问题,都会终止当前的操作。

2.3.20 ansi

real_as_float、pipes_as_concat、ansi_quotes 和 ignore_space 的组合。

2.3.21 oracle

pipes_as_concat、ansi_quotes、ignore_space、no_key_options、no_table_options、no_field_options 和 no_auto_create_user 的组合。
后面几个 no 开头的具体表示什么呢?

2.3.22 traditional

strict_trans_tables、strict_all_tables、no_zero_in_date、no_zero_date、error_for_division_by_zero、no_auto_create_user、no_unsigned_subtraction的组合。

2.3.23 mssql

pipes_as_concat、ansi_quotes、ignore_space、no_key_options、no_table_options、no_field_options 的组合。

2.3.24 db2

pipes_as_concat、ansi_quotes、ignore_space、no_key_options、no_table_options、no_field_options 的组合。

2.3.25 mysql323

no_field_options、high_not_precedence 的组合。

2.3.26 mysql40

no_field_options、high_not_precedence 的组合。

2.3.27 maxdb

pipes_as_concat、ansi_quotes、ignore_space、no_key_options、no_table_options、no_field_options、no_auto_create_user 的组合。

3、日期和时间类型

类型 所占空间 表示范围
datetime 8字节 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
date 3字节 1000-01-01 ~ 9999-12-31
timestamp 4字节 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07(UTC)
year 1字节 1901~2155 或者 1970~2070
time 3字节 -838:59:59 ~ 838:59:59

3.1 datetime 和 date

datetime 的格式为年月日时分秒
date 的格式为年月日

3.2 timestamp

建表时,列为 timestamp 的日期类型可以设置默认值,而 datetime 不行。
在更新表时,可以设置 timestamp 类型的列自动更新为当前时间。

3.3 year 和 time

3.3.1 year

year 类型占用1字节,并且在定义时可以指定显示的宽度为year(4)或者 year(2)。
year(4)显示的年份为1901~2155。
year(2)显示的年份范围为1970~2070。00~69表示2000~2069。

3.3.2 time

占用3字节,显示的范围为 -838:59:59 ~ 838:59:59
time 类型可以用来保存一天中的时间,也可以用来保存时间间隔。

3.4 日期和时间相关的函数

3.4.1 now(),current_timestamp(),sysdate()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql> select now(),current_timestamp(),sysdate(),sleep(2),
    now(),current_timestamp(),sysdate()\G
*************************** 1. row ***************************
              now(): 2020-03-20 16:27:35
current_timestamp(): 2020-03-20 16:27:35
          sysdate(): 2020-03-20 16:27:35
           sleep(2): 0
              now(): 2020-03-20 16:27:35
current_timestamp(): 2020-03-20 16:27:35
          sysdate(): 2020-03-20 16:27:37

从上面可以看出三者的区别是:
now()和current_timestamp()是相同的,返回的是执行 sql 语句时的时间。
sysdate()返回的是执行该函数时的时间

3.4.2 时间加减函数

date_add(date, interval expr unit)
date_sub(date, interval expr unit)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mysql> select now() as '现在时间', 
    date_add(now(), interval 1 hour) as '下个小时', 
    date_add(now(), interval 1 day) as '明天此时', 
    date_add(now(), interval 1 week) as '下周此时', 
    date_add(now(), interval 1 month) as '下月此时', 
    date_add(now(), interval 1 year) as '明年此时'\G
*************************** 1. row ***************************
: 2020-03-20 16:33:55
: 2020-03-20 17:33:55
: 2020-03-21 16:33:55
: 2020-03-27 16:33:55
: 2020-04-20 16:33:55
: 2021-03-20 16:33:55

注意:expr 可以是负数。
如果目标年份是闰月,那么返回2月29日,如果不是,返回日期是2月28日

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mysql> select date_add('2000=02-29', interval 4 year);
+-----------------------------------------+
| date_add('2000=02-29', interval 4 year) |
+-----------------------------------------+
| 2004-02-29                              |
+-----------------------------------------+
mysql> select date_add('2000=02-29', interval 1 year);
+-----------------------------------------+
| date_add('2000=02-29', interval 1 year) |
+-----------------------------------------+
| 2001-02-28                              |
+-----------------------------------------+

3.4.3 date_format函数

按照需要的格式打印日期。

1
2
3
4
5
6
mysql> select date_format(now(), '%Y-%m-%d %H:%i:%m') as '现在时间';
+---------------------+
|             |
+---------------------+
| 2020-03-20 16:41:03 |
+---------------------+

详细的格式可以看这里

4、数字类型

4.1 整型

MySQL 数据库支持的整型有以下几种

类型 占用空间(字节) 范围(signed) 范围(unsigned)
tinyint 1 (-128,127) (0,255)
smallint 2 (-32 768,32 767) (0,65 535)
mediumint 3 (-8 388 608,8 388 607) (0,16 777 215)
int 4 (-2 147 483 648,2 147 483 647) (0,4 294 967 295)
bigint 8 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615)

4.2 浮点型(非精确类型)

单精度的 float

双精度的 double

4.3 高精度类型

decimal和numeric在 MySQL 里是相同的。最大位数是65。
decimal(M,N): M 是精度,表示保存值的主要位数;N 是标度,表示小数点后面可以保存的位数。

4.4 位类型

位类型可用来保存位字段的值。bit(M)表示允许存储 M 位数值,M 范围为1到64,占用的空间为(M+7)/8字节。如果 bit(M)列分配的值的长度小于 M 位,则在值的左边用0填充。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
mysql> create table c (a bit(4));
mysql> insert into c select b'1000';
mysql> select a from c;
+------+
| a    |
+------+
|    |
+------+
mysql> select hex(a) from c;
+--------+
| hex(a) |
+--------+
| 8      |
+--------+

5、字符类型

5.1 字符集

我的理解,字符集是符合一定条件的编码规范。MySQL 数据库中,默认的字符集是 latin1。可以通过 show charset 查看MySQL 数据库支持的字符集。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
+----------+---------------------------------+---------------------+--------+

实际显示结果总共有41行,这里删除一些。第一列是字符集的名称,第三列是排序规则,最后一列代表这个字符集的1个字符可能占用的最大字节空间,单位是字节(Byte)。
对字符集的设置可以在 MySQL 的配置文件中修改

1
2
[mysqld]
character_set_server=utf8mb4

查看当前使用的字符集

1
2
3
4
5
6
mysql> status;
--------------
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8
Conn.  characterset:    utf8

设置当前会员连接的字符集,当前会话的客户端的字符集,当前会话返回结果集的字符集。

1
2
3
4
5
6
7
mysql> set names 'utf8mb4';
mysql> status;
--------------
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4

为表,或者表里的字段设置单独的字符集

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mysql> create table d (a varchar(10) charset gbk, 
b varchar(20) charset utf8, 
c varchar(30) 
)charset utf8mb4;
mysql> show create table d\G
*************************** 1. row ***************************
       Table: d
Create Table: CREATE TABLE `d` (
  `a` varchar(10) CHARACTER SET gbk DEFAULT NULL,
  `b` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `c` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

5.2 排序规则

排序规则(collation)是指对指定字符集下不同字符的比较规则。其特征如下:
①. 两个不同的字符集不能用相同的排序规则。
②. 每个字符集有一个默认的排序规则。
③. 一些常用的规则。
_ci 结尾的表示大小写不敏感(case insensitive)
_cs结尾的表示大小写敏感(case sensitive)
_bin表示二进制(binary)的比较
查看 MySQL 支持的排序规则

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mysql> show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation                | Charset  | Id  | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| utf8_croatian_ci         | utf8     | 213 |         | Yes      |       8 |
| utf8_unicode_520_ci      | utf8     | 214 |         | Yes      |       8 |
| utf8_vietnamese_ci       | utf8     | 215 |         | Yes      |       8 |
| utf8_general_mysql500_ci | utf8     | 223 |         | Yes      |       1 |
| utf8mb4_general_ci       | utf8mb4  |  45 | Yes     | Yes      |       1 |
| utf8mb4_bin              | utf8mb4  |  46 |         | Yes      |       1 |
| utf8mb4_unicode_ci       | utf8mb4  | 224 |         | Yes      |       8 |
| utf8mb4_icelandic_ci     | utf8mb4  | 225 |         | Yes      |       8 |
+--------------------------+----------+-----+---------+----------+---------+

实际展示有222种,这里删除了大部分。也可以这样查看

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql> select * from  information_schema.collations limit 5;
+------------------+--------------------+----+------------+-------------+---------+
| COLLATION_NAME   | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+------------------+--------------------+----+------------+-------------+---------+
| big5_chinese_ci  | big5               |  1 | Yes        | Yes         |       1 |
| big5_bin         | big5               | 84 |            | Yes         |       1 |
| dec8_swedish_ci  | dec8               |  3 | Yes        | Yes         |       1 |
| dec8_bin         | dec8               | 69 |            | Yes         |       1 |
| cp850_general_ci | cp850              |  4 | Yes        | Yes         |       1 |
+------------------+--------------------+----+------------+-------------+---------+

5.3 char 和 varchar

char(N) 用来保存固定长度的字符串,N的范围是0~255。对于存储的长度小于 N 的情况,MySQL 会在列的右边自动进行填充,直到字符串达到指定的长度 N。 而在读取时,MySQL 会自动将填充的字符删除。如果将 sql_mode 设置为pad_char_to_full_length,则返回时不会自动删除。
varchar(N) 用来保存变长字符串,N 的范围是0 ~ 65535。
N 都是代表字符长度,不是字节长度。

5.4 binary 和 varbinary

跟 char 和 varchar 类似,只不过存储的是二进制的字符串,没有字符集的概念。并且 binary(N)varbinary(N) 中的 N 指的是字节长度。

5.5 blob 和 text

5.5.1 blob

blob(binary large object):用来存储二进制大数据类型的。根据存储长度的不同,可以细分为以下4种类型,括号种的数字代表存储的字节数。
①. tinyblob(2^8)
②. blob(2^16)
③. mediumblob(2^24)
④. longblob(2^32)

5.5.2 text

text 也可以细分为4种类型,如下:
①. tinytext(2^8)
②. text(2^16)
③. mediumtext(2^24)
④. longtext(2^32)

5.5.3 注意点

1、在 blob 和 text 类型的列上创建索引时,必须指定索引前缀的长度。而 varchar 和 varbinary 的前缀长度是可选的。
2、blob 和 text类型的列不能有默认值。
3、在排序时只使用列的前 max_sort_length 个字节。max_sort_length的默认值为1024,可以动态调整。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
mysql> select @@max_sort_length;
+-------------------+
| @@max_sort_length |
+-------------------+
|              1024 |
+-------------------+
mysql> set max_sort_length = 2048;
mysql> select @@max_sort_length;
+-------------------+
| @@max_sort_length |
+-------------------+
|              2048 |
+-------------------+

4、在数据库中,最小的存储单元是页。为了有效存储列类型为 blob 或者 text 的大数据类型,一般将列的值存放在行溢出页,而数据页存储的行数据只包含 blob 或 text 类型数据列前一部分数据。 image-20200320182857232 5、在 InnoDB 存储引擎内部,会将比较大的 varchar 类型字符串自动转换为 text 或者 blob。

5.6 enum 和 set

enum 和 set 都是集合类型,不同的是 enum 最多可以枚举65536个元素,而 set 最多可以枚举64个元素。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mysql> create table e (
    user varchar(30), 
    sex enum('F', 'M'));
mysql> set sql_mode='strict_trans_tables';
mysql> insert into e select 'demo', 'F';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into e select 'test', 'K';
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> select * from e;
+------+------+
| user | sex  |
+------+------+
| demo | F    |
+------+------+