文章目录

  • 字符串类型数据测试
  • TEXT类型和TINYTEXT,MEDIUMTEXT,LONGTEXT
  • 枚举类型(ENUM类型)
  • 集合类型(SET类型)
  • ENUM和SET的区别:
  • 相同点:


字符串类型数据测试

char 为分配时为固定长度,当超过指定长度时,便会报错,不存入数据
varchar分配时为指定数据长度+1,当超过指定长度时,便会报错,不存入数据

mysql> CREATE TABLE test_str(
    -> a CHAR(5),
    -> b VARCHAR(5)
    -> );
Query OK, 0 rows affected (0.94 sec)

mysql> INSERT test_str(a, b) VALUES('', '');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT test_str(a, b) VALUES('a', 'a');
Query OK, 1 row affected (0.10 sec)

mysql> INSERT test_str(a, b) VALUES('ab', 'ab');
Query OK, 1 row affected (0.23 sec)

mysql> INSERT test_str(a, b) VALUES('abc', 'abc');
Query OK, 1 row affected (0.15 sec)

mysql> INSERT test_str(a, b) VALUES('abcd', 'abcd');
Query OK, 1 row affected (0.07 sec)

mysql> INSERT test_str(a, b) VALUES('abcde', 'abcde');
Query OK, 1 row affected (0.07 sec)

mysql> INSERT test_str(a, b) VALUES('abcdef', 'abcdef');
ERROR 1406 (22001): Data too long for column 'a' at row 1

mysql> INSERT test_str(a, b) VALUES('abcde', 'abcdef');
ERROR 1406 (22001): Data too long for column 'b' at row 1

mysql> INSERT test_str(a, b) VALUES(' 123  ', ' 123  ');
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> SELECT * FROM test_str;
+-------+-------+
| a     | b     |
+-------+-------+
|       |       |
| a     | a     |
| ab    | ab    |
| abc   | abc   |
| abcd  | abcd  |
| abcde | abcde |
|  123  |  123  |
+-------+-------+
7 rows in set (0.00 sec)

char和varchar虽然都是字符串类型,但是是有区别的,char定义的是固定长度,长为0-255,存储时,如果字符数没有达到定义的位数,会在后面用空格补全存入数中。
char在显示时,如果位数不够指定的长度,在检索或查询的时候便会把后面空格的部分截断,不显示。
varchar在显示时,在检索或查询的时候后面的空格会保留,会显示出来。

但是当要存储的数据大于255 时,只能使用varchar类型。

mysql> SELECT CONCAT('*', a, '*'), CONCAT('*', b, '*') FROM test_str;
+---------------------+---------------------+
| CONCAT('*', a, '*') | CONCAT('*', b, '*') |
+---------------------+---------------------+
| **                  | **                  |
| *a*                 | *a*                 |
| *ab*                | *ab*                |
| *abc*               | *abc*               |
| *abcd*              | *abcd*              |
| *abcde*             | *abcde*             |
| * 123*              | * 123 *             |
+---------------------+---------------------+
7 rows in set (0.01 sec)
TEXT类型和TINYTEXT,MEDIUMTEXT,LONGTEXT

text类型不能有默认值。
效率没有char或者varchar效率高。
查询时区分大小写,因为它检索查询的时候,没有大小写转换。

text类型存储时的最大字节数为65535

mysql> CREATE TABLE test_str1(
    -> content TEXT DEFAULT "This is a test"
    -> );
ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'content' can't have a default value
枚举类型(ENUM类型)

enum类型的值,每个值都会对应一个编号,且这个编号是从1开始的。(这点和咱们平时的数组类型不一样,要注意!!!)
enum类型保存数据时保存的不是它的值,而是该值对应的编号。

mysql> CREATE TABLE IF NOT EXISTS test_enum(
    -> sex ENUM('男', '女', '保密')
    -> );
Query OK, 0 rows affected (0.78 sec)

mysql> DESC test_enum;
+-------+----------------------------+------+-----+---------+-------+
| Field | Type                       | Null | Key | Default | Extra |
+-------+----------------------------+------+-----+---------+-------+
| sex   | enum('男','女','保密')     | YES  |     | NULL    |       |
+-------+----------------------------+------+-----+---------+-------+
1 row in set (0.05 sec)

mysql> INSERT test_enum(sex) VALUES('男');
Query OK, 1 row affected (0.17 sec)

mysql> SELECT * FROM test_enum;
+------+
| sex  |
+------+
| 男   |
+------+
1 row in set (0.00 sec)

null值可以为空,即enum类型的值可以为null

mysql> INSERT test_enum(sex) VALUES(null);
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM test_enum;
+------+
| sex  |
+------+
| 男   |
| NULL |
+------+
2 rows in set (0.00 sec)

mysql> INSERT test_enum(sex) VALUES(1);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT test_enum(sex) VALUES(3);
Query OK, 1 row affected (0.12 sec)

mysql> INSERT test_enum(sex) VALUES(5);
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

mysql> SELECT * FROM test_enum;
+--------+
| sex    |
+--------+
| 男     |
| NULL   |
| 男     |
| 保密   |
+--------+
4 rows in set (0.03 sec)

可以看出,enum的值的下标是从1开始的,且一次只能从类出来的值中选一个。

集合类型(SET类型)

一次能从列表中的值中选1个或多个(!!!注意在选多个值时,中间不能有多余的空格,逗号后面也不能有空格)。

mysql> CREATE TABLE test_set(
    -> a SET('A', 'B', 'C', 'D', 'E', 'F')
    -> );
Query OK, 0 rows affected (1.43 sec)

mysql> INSERT test_set(a) VALUES('A');
Query OK, 1 row affected (0.10 sec)

mysql> INSERT test_set(a) VALUES('B');
Query OK, 1 row affected (0.14 sec)

mysql> INSERT test_set(a) VALUES('C');
Query OK, 1 row affected (0.07 sec)

mysql> INSERT test_set(a) VALUES('C,D');
Query OK, 1 row affected (0.09 sec)

mysql> INSERT test_set(a) VALUES('F, A'),('A, F, D');
ERROR 1265 (01000): Data truncated for column 'a' at row 1

set不管你存入数据时是什么顺序,它会自动按照定义时后的顺序进行存储。

mysql>  INSERT test_set(a) VALUES('E,A,D'),('B,F,A');
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test_set;
+-------+
| a     |
+-------+
| A     |
| B     |
| C     |
| C,D   |
| A,D,E |
| A,B,F |
+-------+
6 rows in set (0.03 sec)

在插入数据时,只能选择定义表时定义的列表中的数据,不能选不存在列表中的数据。

在插入数据时,也可以使用下标插入。

下面的代码示例中,插入编号为2 的数,显示的是B,所以SET 和ENUM一样,编号 是从1开始的

mysql> INSERT test_set(a) VALUES('C,F,A,H');
ERROR 1265 (01000): Data truncated for column 'a' at row 1
mysql> INSERT test_set(a) VALUES(2);
Query OK, 1 row affected (0.06 sec)

mysql> SELECT * FROM test_set;
+-------+
| a     |
+-------+
| A     |
| B     |
| C     |
| C,D   |
| A,D,E |
| A,B,F |
| B     |
+-------+
7 rows in set (0.02 sec)

SET类型值也可以为null, 且可以添加重复元素

mysql> INSERT test_set(a) VALUES(null);
Query OK, 1 row affected (0.07 sec)

mysql> SELECT * FROM test_set;
+-------+
| a     |
+-------+
| A     |
| B     |
| C     |
| C,D   |
| A,D,E |
| A,B,F |
| B     |
| NULL  |
+-------+
8 rows in set (0.00 sec)

mysql> INSERT test_set(a) VALUES(null);
Query OK, 1 row affected (0.10 sec)

mysql> SELECT * FROM test_set;
+-------+
| a     |
+-------+
| A     |
| B     |
| C     |
| C,D   |
| A,D,E |
| A,B,F |
| B     |
| NULL  |
| NULL  |
+-------+
9 rows in set (0.00 sec)
ENUM和SET的区别:

ENUM类型最多可以列举65535个。
SET类型最多可以列举64个。
ENUM类型插入数据时,一次只能从列表中选取一个元素。
SET类型可以选取列表中的多个数据,依次用,隔开,不要写多余的空格。

相同点:

编号都从1开始,值都可以为null,可以重复添加