文章目录
- 字符串类型数据测试
- 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,可以重复添加