MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。

数值类型

数值类型又分为整数型与小数型

整数型

下面的表显示了需要的每个整数类型的存储和范围

创建一张表

mysql> CREATE TABLE t_int (
int_1 TINYINT,
int_2 SMALLINT,
int_3 MEDIUMINT,
int_4 INT,
int_5 BIGINT);
Query OK, 0 rows affected mysql> DESC t_int;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| int_1 | tinyint(4) | YES | | NULL | |
| int_2 | smallint(6) | YES | | NULL | |
| int_3 | mediumint(9) | YES | | NULL | |
| int_4 | int(11) | YES | | NULL | |
| int_5 | bigint(20) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
5 rows in set

插入数据,只能插入整型,数据类型不正确或者超出范围都会导致插入数据失败

mysql> INSERT INTO t_int VALUES(100, 100, 100, 100, 100);
Query OK, 1 row affected mysql> INSERT INTO t_int VALUES('a', 'b', 100, 200, 300); -- 数据类型不正确
1366 - Incorrect integer value: 'a' for column 'int_1' at row 1
mysql> INSERT INTO t_int VALUES(255, 10000, 1000, 100000, 1000000); -- 超出范围
1264 - Out of range value for column 'int_1' at row 1
mysql> SELECT * FROM t_int;
+-------+-------+-------+-------+-------+
| int_1 | int_2 | int_3 | int_4 | int_5 |
+-------+-------+-------+-------+-------+
| 100 | 100 | 100 | 100 | 100 |
+-------+-------+-------+-------+-------+
1 row in set

SQL中的数值类型全部都是默认有符号,分正负,如果要使用无符号数据,则需要用UNSIGNED关键字对数据类型进行限定

mysql> ALTER TABLE t_int ADD COLUMN int_6 TINYINT UNSIGNED; -- 无符号类型
Query OK, 1 row affected
Records: 1 Duplicates: 0 Warnings: 0 mysql> DESC t_int;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| int_1 | tinyint(4) | YES | | NULL | |
| int_2 | smallint(6) | YES | | NULL | |
| int_3 | mediumint(9) | YES | | NULL | |
| int_4 | int(11) | YES | | NULL | |
| int_5 | bigint(20) | YES | | NULL | |
| int_6 | tinyint(3) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
6 rows in set mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255); -- TINYINT无符号类型的取值范围为0-255
Query OK, 1 row affected mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+
| int_1 | int_2 | int_3 | int_4 | int_5 | int_6 |
+-------+-------+--------+--------+---------+-------+
| 100 | 100 | 100 | 100 | 100 | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 |
+-------+-------+--------+--------+---------+-------+
2 rows in set

给字段加了无符号的限定后,数据插入成功了,在查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字,这个数字表示数据最终显示的位数,例如-123表示显示4位(包括符号位),255表示显示3位,实际上这个数字没有什么特别的含义,只是默认告诉用户可以显示的宽度而已,并不会改变数据的大小。

mysql> ALTER TABLE t_int ADD COLUMN int_7 TINYINT(1) UNSIGNED; -- 显示指定显示宽度
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0 mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255, 255);
Query OK, 1 row affected mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+-------+
| int_1 | int_2 | int_3 | int_4 | int_5 | int_6 | int_7 |
+-------+-------+--------+--------+---------+-------+-------+
| 100 | 100 | 100 | 100 | 100 | NULL | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 | 255 |
+-------+-------+--------+--------+---------+-------+-------+
3 rows in set

显示宽度的意义在于当数据不够显示宽度的时候,可以使用ZEROFILL为数字列进行零填充,这时MySQL自动为该列添加UNSIGNED属性

mysql> ALTER TABLE t_int ADD COLUMN int_8 TINYINT(2) UNSIGNED ZEROFILL;
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT INTO t_int VALUES(127, 10000, 100000, 100000, 1000000, 255, 255, 1);
Query OK, 1 row affected mysql> SELECT * FROM t_int;
+-------+-------+--------+--------+---------+-------+-------+-------+
| int_1 | int_2 | int_3 | int_4 | int_5 | int_6 | int_7 | int_8 |
+-------+-------+--------+--------+---------+-------+-------+-------+
| 100 | 100 | 100 | 100 | 100 | NULL | NULL | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 | NULL | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 | 255 | NULL |
| 127 | 10000 | 100000 | 100000 | 1000000 | 255 | 255 | 01 |
+-------+-------+--------+--------+---------+-------+-------+-------+
4 rows in set

MySQL客户端如Navicat中可能不能正确显示零填充的效果,可以使用命令行窗口进行查看。

小数型

SQL中将小数型又分为浮点型和定点型两种

浮点型:小数点浮动,精度有限,并且会丢失精度(会进行四舍五入),精度位数大概在7位

定点型:小数点固定,精度固定,不会丢失精度,精度位数大概在15位

浮点型

对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。

一个FLOAT类型的数字,允许的值为-3.402823466E+38至-1.175494351E-38,0,1.175494351E-38至3.402823466E+38,这些是基于IEEE标准的理论值,实际范围根据硬件或操作系统可能会稍微小一些。

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

下面以FLOAT为例子,DOUBLE类似

mysql> CREATE TABLE t_float(
float_1 FLOAT,
float_2 FLOAT(10, 2),
float_3 FLOAT(6, 2));
Query OK, 0 rows affected mysql> DESC t_float;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| float_1 | float | YES | | NULL | |
| float_2 | float(10,2) | YES | | NULL | |
| float_3 | float(6,2) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set mysql> INSERT INTO t_float VALUES (1000.10,1000.10,1000.10); -- 正常数据
Query OK, 1 row affected mysql> INSERT INTO t_float VALUES (1234567890,12345678.90,1234.56); -- 正常数据
Query OK, 1 row affected mysql> INSERT INTO t_float VALUES (3e38,3.01e7,1234.56); -- 可以用科学计数法表示
Query OK, 1 row affected mysql> INSERT INTO t_float VALUES (9999999999,99999999.99,9999.99); -- 插入最大值,超过精度位数时系统会进行四舍五入
Query OK, 1 row affected mysql> SELECT * FROM t_float;
+-------------+--------------+---------+
| float_1 | float_2 | float_3 |
+-------------+--------------+---------+
| 1000.1 | 1000.10 | 1000.10 |
| 1234570000 | 12345679.00 | 1234.56 |
| 3e38 | 30100000.00 | 1234.56 |
| 10000000000 | 100000000.00 | 9999.99 |
+-------------+--------------+---------+
4 rows in set

在插入浮点型数据的时候,整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)

mysql> INSERT INTO t_float VALUES (123456,1234.123456768,123.9876543); -- 小数部分超出,四舍五入
Query OK, 1 row affected mysql> INSERT INTO t_float VALUES (123456,1234.12,12345.56);
1264 - Out of range value for column 'float_3' at row 1 mysql> SELECT * FROM t_float;
+-------------+--------------+---------+
| float_1 | float_2 | float_3 |
+-------------+--------------+---------+
| 1000.1 | 1000.10 | 1000.10 |
| 1234570000 | 12345679.00 | 1234.56 |
| 3e38 | 30100000.00 | 1234.56 |
| 10000000000 | 100000000.00 | 9999.99 |
| 123456 | 1234.12 | 123.99 |
+-------------+--------------+---------+
5 rows in set (0.00 sec)

超出精度范围的浮点数,系统会自动进行四舍五入,如果因为系统进位导致整数部分超出指定的长度,这也是被允许的,例如上面的第4条记录。

为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。

定点型

DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度,如

salary DECIMAL(5,2)

在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。

在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL中支持DECIMAL和NUMERIC数据类型的变量形式。M默认值是10。

DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束。

mysql> CREATE TABLE t_decimal (
float_1 FLOAT (10, 2),
decimal_1 DECIMAL (10, 2));
Query OK, 0 rows affected mysql> INSERT INTO t_decimal VALUES (12345678.90,12345678.90); -- 正常数据
Query OK, 1 row affected mysql> INSERT INTO t_decimal VALUES (1234.123456,1234.1234356); -- 小数部分四舍五入
Query OK, 1 row affected mysql> INSERT INTO t_decimal VALUES (99999999.99,99999999.99); -- 最大值
Query OK, 1 row affected mysql> INSERT INTO t_decimal VALUES (99999999.99,99999999.999); -- 进位超出指定位数,不允许
1264 - Out of range value for column 'decimal_1' at row 1 mysql> SELECT * FROM t_decimal;
+--------------+-------------+
| float_1 | decimal_1 |
+--------------+-------------+
| 12345679.00 | 12345678.90 |
| 1234.12 | 1234.12 |
| 100000000.00 | 99999999.99 |
+--------------+-------------+
3 rows in set (0.00 sec)

时间日期类型

表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。

mysql> CREATE TABLE t_date (
id INT,
date_1 DATETIME,
date_2 TIMESTAMP,
date_3 DATE,
date_4 TIME,
date_5 YEAR);
Query OK, 0 rows affected mysql> DESC t_date; -- timestamap不允许为空,有个默认值,为当前时间
+--------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| date_1 | datetime | YES | | NULL | |
| date_2 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| date_3 | date | YES | | NULL | |
| date_4 | time | YES | | NULL | |
| date_5 | year(4) | YES | | NULL | |
+--------+-----------+------+-----+-------------------+-----------------------------+
6 rows in set mysql> INSERT INTO t_date VALUES(1, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '2018'); -- 正常数据
Query OK, 1 row affected mysql> INSERT INTO t_date VALUES(2, '2018-6-24 15:17:58', NULL, '2018-6-24', '15:18:27', '2018'); -- timestamp为空NULL,会自动赋当前时间
Query OK, 1 row affected mysql> SELECT * FROM t_date;
+----+---------------------+---------------------+------------+----------+--------+
| id | date_1 | date_2 | date_3 | date_4 | date_5 |
+----+---------------------+---------------------+------------+----------+--------+
| 1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2018 |
| 2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 | 2018 |
+----+---------------------+---------------------+------------+----------+--------+
2 rows in set

'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的

'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。这里也允许使用“不严格的”语法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等价的。

'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523'和'970523'被解释为 '1997-05-23',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为'0000-00-00'。

YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为 '1983-09-05 13:28:00'。

YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,19830905和830905被解释为'1983-09-05'。

mysql> INSERT INTO t_date VALUES(3, '2018@6@24 15^17^58', '2018#6#24 15+18+14', '2018/6/24', '15:18:27', '2018'); -- 用不同的标点符号做分隔符
Query OK, 1 row affected mysql> SET sql_mode = ''; -- 设置非严格模式,只在该会话中有效
Query OK, 0 rows affected mysql> SELECT @@sql_mode; -- 查看设置是否生效
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set mysql> INSERT INTO t_date VALUES(4, 20180624151758, 180624151814, 20181324, '15:18:27', '2018'); -- 插入20181324时会自动转换为零值,前提是要设置非严格模式,否则报错
Query OK, 1 row affected mysql> SELECT * FROM t_date;
+----+---------------------+---------------------+------------+----------+--------+
| id | date_1 | date_2 | date_3 | date_4 | date_5 |
+----+---------------------+---------------------+------------+----------+--------+
| 1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2018 |
| 2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 | 2018 |
| 3 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2018 |
| 4 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 0000-00-00 | 15:18:27 | 2018 |
+----+---------------------+---------------------+------------+----------+--------+
4 rows in set

YEAR类型可以用二位数,也可以用四位数表示

四位字符串,范围为'1901'到'2155'。

四位数字,范围为1901到2155。

两位字符串,范围为'00'到'99'。'00'到'69'和'70'到'99'范围的值被转换为2000到2069和1970到1999范围的YEAR值。

两位整数,范围为1到99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为一个字符串'0'或'00'或它被解释为0000。

mysql> INSERT INTO t_date VALUES(6, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', 2100);
Query OK, 1 row affected mysql> INSERT INTO t_date VALUES(7, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', 2166); -- 超出范围转换为零值
Query OK, 1 row affected mysql> INSERT INTO t_date VALUES(8, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '69');
Query OK, 1 row affected mysql> INSERT INTO t_date VALUES(9, '2018-6-24 15:17:58', '2018-6-24 15:18:14', '2018-6-24', '15:18:27', '70');
Query OK, 1 row affected mysql> SELECT * FROM t_date;
+------+---------------------+---------------------+------------+----------+--------+
| id | date_1 | date_2 | date_3 | date_4 | date_5 |
+------+---------------------+---------------------+------------+----------+--------+
| 1 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2018 |
| 2 | 2018-06-24 15:17:58 | 2018-06-24 15:35:55 | 2018-06-24 | 15:18:27 | 2018 |
| 3 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2018 |
| 4 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 0000-00-00 | 15:18:27 | 2018 |
| 6 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2100 |
| 7 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 0000 |
| 8 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 2069 |
| 9 | 2018-06-24 15:17:58 | 2018-06-24 15:18:14 | 2018-06-24 | 15:18:27 | 1970 |
+------+---------------------+---------------------+------------+----------+--------+
8 rows in set (0.00 sec)

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

CHAR与VARCHAR类型

CHAR表示定长,如CHAR(10)表示可以存储10个字符,最大长度为255个字符,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR表示变长,如VARCHAR(10)表示可以存储10个字符,最大长度为65535个字符(VARCHAR的最大有效长度由最大行大小和使用的字符集确定,实际最大长度为65532个字符),与CHAR不同的是,VARCHAR值保存时只保存需要的字符数,另加一个字节表示字符的长度(如果长度超过255,则使用两个字节)。

VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留。

下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArMAAACfCAIAAABldMYoAAAgAElEQVR4nO2dT28iSZrG+TR8mzzGIZQLYmSXXb0uJGQGqrs0lFte58q7RVtWydpGbbGUhh5a3mXHJaSccm/TVq2ldlXbyGpWZVnNlAbPBdWBw0pc8hZ7yCT/kYkB8+Ik+vndnCSZyRPxvDwRGWliAgAAAABgSOyhLwAAAAAAEQLJAAAAAAAOSAYAAAAAcEAyAAAAAIADkgEAAAAAHJAMAAAAAOCAZAAAAAAAByQDAAAAADggGQAAAADAAckAAAAAAA5IBgAAAABwQDIAAAAAgMO9ksGXAAAAAIgGUUkG87oOYANVKYCqcoB2pACqygGSgcxAVQqgqhygHSmAqnKAZCAzUJUCqCoHaEcKoKocIBnIDFSlAKrKAdqRAqgqB0gGMgNVKYCqcoB2pACqygGSgcxAVQqgqhygHSmAqnKAZCAzUJUCqCoHaEcKoKocIBnIDFSlAKrKAdqRAqgqB0gGMgNVKYCqcoB2pACqygGSwXToGmOMafpDX8dkLIuqywVUnRfd//iDypi63ejf6zDtcnoWV6IdKYCq80IadyxVMjDlShabhrPtorQ+ss0PkgGYWlXjpvFiM6UyxhhPrGwWvj7+3/8TQgjRPSn9S+mkO/9LvA9mFzfhiZXNnepZj+hUxtV/7mxu7vzn1RjHTcDD1z5gI7c7rK5moqY2nu43bu7XecORxh1LlQyG0WDv1N5iBQPXlgCQDBZPRYnnWr5trVw8FlMqd+xFw5SqGqd7KbOOPHr06FFKZSxb7QghhOhUs4yly22Sq5wZs4s7V8sieI1eHr72RZxFOkhud5hdjSdWHj16tJLgjDGW1PT7DeqJeXh3LFcyGIkG5t+rB+dCCNE7q+5sWi2vpjZf2MHQnQx8kvtbYPDhtZWFeeLx8zLZwGsMpKq2cvGYSTzXqihKRQhRUWKxmFlwhi8rFc++MVf1cW31v+Q5zej2iqJUrFO6d/RuoGJKVc1+sXF4Zf5p9D/e9oXoX9VfPFGd8YfVbZxO4+13QtcYS+41bxovMgluFkzjprH/dGM42nJ1MdcozMYsscbt2/Lzxwk+cngXnvDbO3rGGGOZV9fCd32+Tt07Kz9fUxnjicz+929erk7mEs+5Aj7iROd7cVR6tpja53RYdw+PxZTKTD1cSgdFxR2hJfxe7jAv18orxtnLVcYY3z2xXg3rrYZ1YUxde159+13BOYRM7ghlyZKBmUmHUcAbDERf15JmMLSGTeulCyHEFMmgVy/wYbpcSXDGeObVwuMvnaoVxTXgqCgx+y93tWnlFE9FqihKxbfNXYwCK1hQtTIHN/66Fvx+AqZUtVvLM8bYuvb6w8DZev2nZ2bZsrrZ/g9CiE4t7+00LKXppt11jTHGOTdf/PI/usLsceZYyzrU1nFfDCe/mJqyhzVqauOfG11hnB/Yr5j9OrV7MjLeCUoG+VpXiDGdun+8xZ1zqpxP6JKR2uf9iBOej3u+PiZmNnd4R9a+cfYUPVxWB0XFHWEl/H7uCEoGw9FlaG+1TskTK48epVTO+azJIPruCGTZkoEnGnhjghDCMIYRs7Ed0ljjWtUKGi/PDCGG9dV19AVBpupITQl8xVvDrArlLVTev0YPG1CrhsV4op0pmFZV4/zrz0x7qmvPy29vhyMRT5VxNvBCvSeEXWis182OxwtHt66BjN1JxdXhhr2vuet2w7C3m1/shq5xxtizo54Qdlkr1P3Fb/RuwrBChnbqfr3AGGPrB+eGc+TZkoH7I850vsmZ0R3uMODtg9P0cGkdFEF3eEr4/dwxejfBHvGF9tbzg1X3hZtZe7ZkEH13BLF0ycCKA+ulCyu52l/dxk3jxaadtlhIY41rVfcyLv8xFgeVqv6hjAtrNjRw4tOsQ55S5v6josQCKpVvm1OXA2prwBEImEFV4/atOb3HGOOffX1uCBFQ+8xOY28I6FBmQbPonZWfb3imRc23mkOUdOlyYNy+3k6y4c0Az+op71vc+Lruxr+9HwS/4nRq/420iWfWAmqf6yPecT7nTuBsq39mdYfT+wODwUQ9XF4HRcQdoSX8fu7w7fUPX/751n1HI7C3Bl74jMkg+u4IYPmSgRUN0uXzeoG5goG1FnH7vz4ORGD7TJoMrNmsIfs/LPjzPUgyCB7xeAuYe/5z3E3SkTGM78aq7y0VJfhO63yZWdXBh6OtFGPDUcoMtc9lb2vKMF161zd8x+qdlbL/MKwVfOUPtStXrbVmA4Y8+9O17yrtMxlXh2nmnlMN7dTzTAauj3jH+R6s9ln92jdNP1UPl9dB0XDHmBJ+L3c4V9VrbCc994hDe+s8k8ESuGOUJUwGVjTIf/EFd5YSDKU0Z5KGd58C2uf6VYYxey2teShvPUxuN+xFIcZgQPV4SyiEdxPC6kdIXfMvlRru5Cp3QcOV0RFP8JnsTRGcM2if/fhxOOq25jXdoxTXPaa750td9vaumPXse/HNP3L27NsPf/vb3/72ybl7a82Xpg+dx6AGA9fNXQvXmayF46m9U1fxDOjU4+Yvx7nkjtp31/msT7L4+dJWLq5URoPBND1cWgdFwx1jSvi93OH+WjfXPfB8reN6KaC3jrubIKM7RljGZGC3hTsYiNO95DA+riS4qqoh7eNdWWIdZ5hMdc31NM6jlQR/gAdw6FT1DUWcghJc1/x10P7bPzHqr0tjbnwuyzoDXbO7gffOpDXqN1P/59W23Wlca6yG9WS0MFhLt4bLmlSV2+XmdC/pDCY2nv7TftW8fWtclTOuZV2PUmpQvfCcqa9rSScbhHZq95qnR6mEewXiWJeMr32Tnc+34nFy7uGOVi4ej3tG/VP3cFkdFA13jCnh93KHdybDCitWNgjtrW4HDHvr8BAyusPPUiaDYYF1BwMhes39TIIzxhOPd+o356X1kPYxrmrm/TGeyLxonFXz7hYwbhr7T81nYBhPPH5aOl34Y6+kqrrvh1rlZLjJ/cxVXFHinr1cz2rFva8EPWQd+CSVfQhPGYvoswntP9tPTzE15f7HQXb3YWrKfNrA/UjV6HNZXnvb71ZTn5fObo63hg8z3r7992e/Y16G3bt3Vt0ZPrKlpjZ3/jyaVn1nsgZn6y/PBmJMp+6dlfKmZTL71ZeeKdIxLrmj9k14vuZZOb3o2uf+pvY8fSgm7+FSOigi7ggr4fd0h+8ehzUdMVwXGNZbjZv6jmnVtee1w23mOYSM7vCynMlAamRQdeJqFdX/Z7BgLkrrjP3uq//uW1Wz/9//+rsZCsN9mPF/qyyaaLfj/Fisg6KtagTc4Vt2EFWQDGRGDlUn+99skf0fiAvGnJ60FyZZD34H/N8COpAMIsYiHRRtVSPgDiSDh7oOYANVKYi4qp7/8Wb+8MHb24UufkUy+A0TcVUf3h1IBg91HcAGqlIAVeUA7UgBVJUDJAOZgaoUQFU5QDtSAFXlAMlAZqAqBVBVDtCOFEBVOUAykBmoSgFUlQO0IwVQVQ6QDGQGqlIAVeUA7UgBVJUDJAOZgaoUQFU5QDtSAFXlAMlAZqAqBVBVDtCOFEBVOYhQMgAAAABAFIhKMpjXdQAbqEoBVJUDtCMFUFUOkAxkBqpSAFXlAO1IAVSVAyQDmYGqFEBVOUA7UgBV5QDJQGagKgVQVQ7QjhRAVTlAMpAZqEoBVJUDtCMFUFUOkAxkBqpSAFXlAO1IAVSVAyQDmYGqFMymqq5F/5dXf1vAHRTAHXKAZCAzUJWC8ar2T3ZTQVVuutp3frCq6TNdHZgUuIOCUFWNm/r2Cg/xwFTu6NcLiBHURD8ZVJRYLBZTKpNuBw7Tq0qNDK02zjP9k90n+fzGfZNBp5plSAbEoOZQEKiqcdPY/SyR3d0OcoYQ07nDaBaTSAbURD8ZtHLxWCyea026HThMryo1MrRauKo9XXui6WfldEgyeFnd30ypjDE1tbnf7JkJoFDv2zsZusbXs5+vqWyIeaTeWfn5msoY44nMi8aNYZ6taR2NqamNZ98utaYPAWoOBYGq9vSvv/7+1mgHOkOIYHcYzWJy9eDc2aldTvNMPp/gtjvM9BzoDnA/op8MREUJjulh24HNDKpSI0Grhana07XPths9EVz/dI0xnjl4e2sIMfj4l+I6z9c6olPNsnyta+1j6BpfL10I0S6nXXMGnVpezRy+6xtCDC4PM+Yu/eMtni5dDoQQRv/Xn96jIE4Lag4F475RxiaDUXcYzWIyuXfqejffOu77JxgC3QHuyxIkg1YuHhjTw7YDmxlUpUaCVgtWdZgLwuqfrjGu6fbXd79eYJlX16Jby9vRwA4G3mTQLqfdQyddY6sH5+5kAGYCNYeCmZNBkDtO95xoYAcDbzIIdge4L0uQDMDMQFUKglTt6dpKod4TQoxJBp6tV4cbfPfELIJmNDCaxaQ14PEkA11jfjRdCOOmvrOmqmtP94/e32LCYHrgDgpmTgaB7jg/WLWiQaeatYKBd+cQd4B7gmQgM1CVglFV3blg2mQg+sdbPFvteBZW+ZNB6IKrwafW6/3fr6gru3oveA8QBtxBwXyTgbgorSeLTUN0qll7UsGfDLAckQAkA5mBqhSMqhowbhkZuugaY9uNkflSYUaDfK17uuesuPYkg4vSumeZ4ihYrT0LcAcFs68zCHbHRWk9uXfareWduw2eMHC3O8AsIBnIDFSl4C5Vx65A/PHjQIjBx9daiudrHfMlQ9d4oVhcdd7VreVZ+vDKEMIwDNGp5Xlq6+iXviGEGHxqvWm2heie1t+0PpkLEN+V0vyLo+5cP6X8wB0U3GsFYpA72uX0arFYcC1DON1LJrcbPdMcwe4A9wXJQGagKgWzJgO+Wx8+Z6iuPS+fOdP/RrOY4p5/AtM//yaf4IzxbPVaCDG4PNrJmE9r8cTjp3/8WYjuyVfWM4tMTW3uf4+lBtMCd1AwazIId0enmuVcda1PFH893llTGWPqix+ECHQHuC9IBjIDVSkgUHXw+kuWrXbmfVgwDriDAgJVL0uPk8Umku9CQTKQGahKwfxVHS5CBIsE7qBg/qoOFyGCRYJkIDNQlYI5q2rcvn05fFIbLBC4g4I5qzr48F0hiX9etHiQDGQGqlIwR1Xb5TRjPJHZb+KZw4UDd1AwR1V1zVx0ULvChMHCQTKQGahKAVSVA7QjBVBVDpAMZAaqUgBV5QDtSAFUlQMkA5mBqhRAVTlAO1IAVeUgQskAAAAAAFEgKslgXtcBbKAqBVBVDtCOFEBVOUAykBmoSgFUlQO0IwVQVQ6QDGQGqlIAVeUA7UgBVJUDJAOZgaoUQFU5QDtSAFXlAMlAZqAqBVBVDtCOFEBVOUAykBmoSsFsqnp+VB5EALiDArhDDpAMZAaqUjBe1f7Jbiqoyk1X+84PVjV9pqsDkwJ3UBCgqnH7/ujF5kqCWz+T/PXo/wKfyh39egExgproJ4OKEovFYkrlriNUlFgsFs+1xr4+wXFkgl7VaZGhFcZ5pn+y+ySf37hvMuhUswzJgBjUHAoCVO3pX+8f/fRr3xBCDD6+1lL8i6Oud5dp3GE0i0kkA2qinwxaufik300VZcx+UxxHGuhVnRYZWiFc1Z6uPdH0s3I6JBm8rO5vplTGmJra3G/2zARQqDu/smjoGl/Pfr6msiHmkXpn5edrKmOMJzIvGjfmD8z0mtbRmJraePbtUmv6EKDmUHD3N0pQCghyh9EsJlcPzp2d2uU0z+TzCW67w0zPcAcB0U8GoqJMGrvHf4dNfhxpWICq0yJBK4Sp2tO1z7YbPdEOSwaMZw7e3hpCDD7+pbjO87WO6FSzLF/rWvsYusbXSxfmbzA6cwadWl7NHL7rG0IMLg8z5i794y2eLl0OhBBG/9ef3t/g9+imBDWHgrHfKEb/1x8PMols1W+PQHcYzWIyuXc63Kddtn6s3Bst4A4SliAZtHJxv/lauXjMwv1SRYnnWuYMXsAsX8BxZGcBqk6LBK0QrOowF4jwZMA13S5Q/XqBZV5di24tb0cDOxh4k0G7nHYPnXSNrR6cu2sfmAnUHApCVG2X0+Yw/3d/ePU/tyPf0yHuON1zooEdDLzJAO6gYQmSQQCtSmVot4rihHLvbT/3K79RoCoFQar2dG2lUDcXVoUmA8/Wq8MNvntiFkEzGhjNYtIMBt5koGvMj6YLYdzUd9ZUde3p/tH70VIL7gTuoGC8qoNPraOtFM/XOt7tYe44P1i1okGnmrWCgXdnuIOGJU0GTn53r/Dx+7Ki/MZtClUpGFXVnQumTQaif7zFs9WOZ2GVPxmELrgafGq93v/9irqyq4+s9wbjgTsouFtVo7HNMq+uPdtC3XFRWk8Wm4boVLP2pII/GcAdBCxjMvCYsZWLu1zqnbqDS6EqAaOqBoxb7OVR7n22GyPzpcKMBvla93TPWXHtSQYXpXXPMsVRsFp7FuAOCu5W1dX1bcLdcVFaT+6ddmt5526DJwzAHTQsZzJwzOhZ4lNR3Hf6MLMHVUm4S9WxKxB//DgYPrplT6kausYLxeKq865uLc/Sh1eGEIZhiE4tz1NbR7+Yj319ar1ptoXontbftD6ZS6zeldKjD4KBO4A7KAhQ9Wf96KcPnwZCCGH0fwm7mxDmjnY5vVosFlzLEE73ksntRs80B9xBwzImA89iIEWJm5N71g2/nGK/9Btb+hMAVKVg1mTAd+vDJ6nUteflM2eC02gWU5y739Q//yaf4IzxbPVaCDG4PNrJmE9r8cTjp3/8WYjuyVfWU1lMTW3uf4+bqdMCd1AQoGr7zzvDrsoTK5svXn8YWRk4zh2dapZz1bU+Ufz1eGdNZYypL34QAu4gYSmTAZgQqEoBgaqD11+ybLVz945gfsAdFBCoell6nCw28d2+UJAMZAaqUjB/VYeLEMEigTsomL+qw0WIYJEgGcgMVKVgzqoat29fDp/UBgsE7qBgzqoOPnxXGD7LCxYIkoHMQFUK5qhqu5xmjCcy+6O/MQOogTsomKOqumYuOqhdYcJg4SAZyAxUpQCqygHakQKoKgdIBjIDVSmAqnKAdqQAqsoBkoHMQFUKoKocoB0pgKpygGQgM1CVAqgqB2hHCqCqHEQoGQAAAAAgCkQlGczrOoANVKUAqsoB2pECqCoHSAYyA1UpgKpygHakAKrKAZKBzEBVCqCqHKAdKYCqcoBkIDNQlQKoKgdoRwqgqhwgGcgMVKUAqsoB2pECqCoHSAYyA1UpmE1VXWMBv80MHg64gwK4Qw6QDGQGqlIwXtX+yW4qqMpNV/vOD1Y1faarA5MCd1AQqGq7nGYuRo0wlTv69QJiBDXRTwYVJRaLxZTKXUeoKLFYLJ5rzXb+Vi7ue/ek540yUJWCcZ7pn+w+yec37psMOtUsQzIgBu6gIFDVk12eeXU95l3TuMNoFpNIBtREPxmM+ieUijKzS4UQrZzifvcU540sUJWCcFV7uvZE08/K6ZBk8LK6v5lSGWNqanO/2TMTQKHu/P6yoWt8Pfv5muobXvXOys/XVMYYT2ReNG7Mn57rNa2jMTW18ezbpdb0IYA7KAhS1Whs3xF0g9xhNIvJ1YNzZ6d2Oc0z+XyC2+4wDwp3EBD9ZCAqyqQxeq4uneK8kQWqUhCmak/XPttu9EQ7LBkwnjl4e2sIMfj4l+I6z9c6olPNsnyta+1j6BpfL12Ys69OKe3U8mrm8F3fEGJweZgxd+kfb/F06XIghDD6v/70/ga/VDslcAcFQaq2y2mmqipjjPHE4+fls5HfHA90h9EsJpN7p66j8K3jvn+CAe4gYQmSQSsX95uvlYvHLNwvVZR4rmXOyPln+VzvUBTHzPbOMaXid2nAeZcNqEpBsKrDXCDCkwHXdLtA9esFlnl1Lbq1vB0N7GDgTQbtcto9dNI1tnpw7q59YCbgDgoCVTX6f/973xBCDD61jrZSPF/reHcIccfpnhMN7GDgTQZwBw1LkAwCaFUqQ/tUFCdke2/7Oa+0cnFnp1Yubu3jtqEM83ijQFUKglTt6dpKoW4OhUKTgWfr1eEG3z0xi6AZDYxmMWkGA28y0DXmR9OFMG7qO2uquvZ0/+j9LYZE0wN3UHC3qt1anvlXHYS54/xg1YoGnWrWCgbeneEOGpY0GThp3L1ix+1Y82+lIkan7OyD+GfyfoMudQNVJ2NUVXcumDYZiP7xFs9WO56FVf5kELrgavCp9Xr/9yvqyq4+MkMLxgN3UDCBqgEdOtQdF6X1ZLFpiE41a08q+JMB3EHAMiYDjxlbubjLpXGf7+DSifeFqpMyqmrAuMVeHuXeZ7sxMl8qzGiQr3VP95wV155kcFFa9yxTHAWrtWcB7qDgblX9y26FGOeOi9J6cu+0W8s7dxs8YQDuoGE5k4FjJ8+SnYrinp3zzOy5DGjP87kN7prwkwioSsFdqo5dgfjjx4EQg4+vNdfNVkPXeKFYXHXe1a3lWfrwyhDCMAzRqeV5auvol+Gd2jfNthDd0/qb1idzidW7Upp/cdSd66eUH7iDggBVrxuvjn761ey9H388yPDU3qlvgn+MO9rl9GqxWHAtQzjdSya3Gz3THHAHDcuYDDyLgRQlbk7uWTf8cvb6noAnhX0zgZ4ZQiUn320/qErBrMmA79aHT1Kpa54F2kazmOLc/ab++Tf5BGeMZ6vXQojB5dFOxnxaiyceP/3jz0J0T76ynspiampz/3vcTJ0WuIOCAFX7p6Wnj+3e+7z8drSvjnNHp5rlXHWtTxR/Pd5ZUxlj6osfhIA7SFjKZAAmBKpSQKDq4PWXLFvt3L0jmB9wBwUEql6WHieLTXy3LxQkA5mBqhTMX9XhIkSwSOAOCuav6nARIlgkSAYyA1UpmLOqxu3bl8MntcECgTsomLOqgw/fFYbP8oIFgmQgM1CVgjmq2i6nGeOJzH4TT1UtHLiDgjmqqmvmooPaFSYMFg6SgcxAVQqgqhygHSmAqnKAZCAzUJUCqCoHaEcKoKocIBnIDFSlAKrKAdqRAqgqB0gGMgNVKYCqcoB2pACqykGEkgEAAAAAokBUksG8rgPYQFUKoKocoB0pgKpygGQgM1CVAqgqB2hHCqCqHCAZyAxUpQCqygHakQKoKgdIBjIDVSmAqnKAdqQAqsoBkoHMQFUKoKocoB0pgKpygGQgM1CVgtlU1TUW8NvM4OGAOyiAO+QAyUBmoCoF41Xtn+ymgqrcdLXv/GBV02e6OjApcAcFgaq2y2nmYtQIU7mjXy8gRlAT/WRQUWKxWEyp3HWEihKLxeK51mznb+XiE7/bvKLYXZdVUcbuMOnnug/RU3URn5qacZ7pn+w+yec37psMOtUsQzIgBu6gIFDVk12eeXU95l3TuMNoFpNIBtREPxlM8Z1dUWZ2qRCilVMmeXcrF5/YuhUlfNdpssisRE/VRXxqasJV7enaE00/K6dDksHL6v5mSmWMqanN/WbPTACFuvP7y4au8fXs52uqb3jVOys/X1MZYzyRedG4MX96rte0jsbU1Mazb5da04cA7qAgSFWjsX1H0A1yh9EsJlcPzp2d2uU0z+TzCW67wzwo3EFA9JOBqCiTxuiFJINpTjIuGUzxuWYmgqou4FNTE6ZqT9c+2270RDssGTCeOXh7awgx+PiX4jrP1zqiU82yfK1r7WPoGl8vXZizr04p7dTyaubwXd8QYnB5mDF36R9v8XTpciCEMPq//vT+Br9UOyVwBwVBqrbLaaaqKmOM8cTj5+Wzkd8cD3SH0Swmk3unrqPwreO+f4IB7iBhCZJBKxf3m6+Viw/n890vVZR4rmXP9cdH0rh1B0BxzOzcGFAqbpe6bhi4DuM6iO9egv1KPFfJxe2XKopSsQ/ld3zA55o3EVM15LzLRrCqw1wgwpMB13S7QPXrBZZ5dS26tbwdDexg4E0G7XLaPXTSNbZ6cO6ufWAm4A4KAlU1+n//e98QQgw+tY62Ujxf63h3CHHH6Z4TDexg4E0GcAcNS5AMAmhVKq7vcPsr13vbz3mllYs7O7VycWsftw0983iecYD7BCMvjuziXVxQUUIOuiAipao0BKna07WVQt0cCoUmA8/Wq8MNvntiFkEzGhjNYtIMBt5koGvMj6YLYdzUd9ZUde3p/tH7WwyJpgfuoOBuVbu1PPOvOghzx/nBqhUNOtWsFQy8O8MdNCxpMvAM3t0u9X2JKxUReptgdCbPcqlrwiBguD/6De+9Z+AtG55phYXPE0ZJVXkYVdWdC6ZNBqJ/vMWz1Y5nYZU/GYQuuBp8ar3e//2KurKrj8zQgvHAHRRMoGpAhw51x0VpPVlsGqJTzdqTCv5kAHcQsIzJwGNG9xeu32czJ4Nxdr0rGXgvaHmSAbWq8jCqasC4xV4e5d5nuzEyXyrMaJCvdU/3nBXXnmRwUVr3LFMcBau1ZwHuoOBuVf3LboUY546L0npy77Rbyzt3GzxhAO6gYTmTgWMnz5Id9+S9b2bPt1rAcm/c43bXxP/Ypw0D7iaEXtAyJQNiVaXhLlXHrkD88eNAiMHH15rrZquha7xQLK467+rW8ix9eGUIYRiG6NTyPLV19MvwTu2bZluI7mn9TeuTucTqXSnNvzjqzvVTyg/cQUGAqteNV0c//Wr23o8/HmR4au/UN8E/xh3tcnq1WCy4liGc7iWT242eaQ64g4ZlTAaexUCKYi34s2745exbAQFPCocuHIzFYkrOddvPO3U4PFL4CkTn8HFFiQ+XHzp72e9cbDiImKqSMGsy4Lv14ZNU6ppngbbRLKY4d7+pf/5NPsEZ49nqtRBicHm0kzGf1uKJx0//+LMQ3ZOvrKeymJra3P8eN1OnBe6gIEDV/mnp6WO79z4vvx3tq+Pc0almOVdd6xPFX4931lTGmPriByHgDhKWMhlEmoeYGwhDHlWjBIGqg9dfsmy1c/eOYH7AHRQQqHpZepwsNvHdvlCQDOZMpJ47kkbVSDF/VYeLEMEigTsomL+qw0WIYJEgGcwF96PLlYe+GIclVzWizD0JdIUAAADuSURBVFlV4/bty+GT2mCBwB0UzFnVwYfvCsNnecECQTKQGahKwRxVbZfTjPFEZr+Jp6oWDtxBwRxV1TVz0UHtChMGCwfJQGagKgVQVQ7QjhRAVTlAMpAZqEoBVJUDtCMFUFUOkAxkBqpSAFXlAO1IAVSVgwglAwAAAABEgUgkAwAAAABIBpIBAAAAAByQDAAAAADggGQAAAAAAAckAwAAAAA4IBkAAAAAwAHJAAAAAAAOSAYAAAAAcEAyAAAAAIADkgEAAAAAHJAMAAAAAOCAZAAAAAAAByQDAAAAADggGQAAAADAAckAAAAAAA7/Dz8uWDiLuvqxAAAAAElFTkSuQmCC" alt="" />

请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。

定长的磁盘空间比较浪费, 但是效率高

相反的,变长的磁盘空间比较节省, 但是效率低

BINARY与VARBINARY类型

BLOB与TEXT类型

通常超过255个字符的数据使用大文本进行存储,根据存储的数据格式分为BLOB与TEXT,BLOB用来存储二进制数据(少用),TEXT用来存储文字。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

ENUM类型

ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值,每个枚举值有一个索引(NULL值的索引是NULL),从1开始编号

mysql> CREATE TABLE t_enum ( -- 创建枚举表
gender ENUM('man', 'woman', 'unknow')); Query OK, 0 rows affected mysql> INSERT INTO t_enum VALUES ('man');
Query OK, 1 row affected mysql> INSERT INTO t_enum VALUES ('woman');
Query OK, 1 row affected mysql> INSERT INTO t_enum VALUES ('haha'); -- 不在枚举定义的值里面,不允许插入,起到规范数据的作用
1265 - Data truncated for column 'gender' at row 1

如果在数值上下文中检索一个ENUM值,将返回列值的索引。例如,你可以这样从ENUM列搜索数值值:

mysql> SELECT gender + 0, gender FROM t_enum;
+------------+--------+
| gender + 0 | gender |
+------------+--------+
| 1 | man |
| 2 | woman |
+------------+--------+
2 rows in set

由于枚举存储的是数值,所以可以直接插入数值

mysql> INSERT INTO t_enum VALUES (1), (2); -- 直接插入数值
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT gender + 0, gender FROM t_enum;
+------------+--------+
| gender + 0 | gender |
+------------+--------+
| 1 | man |
| 2 | woman |
| 1 | man |
| 2 | woman |
+------------+--------+
4 rows in set

SET类型

集合跟枚举很类似,实际存储的是数值(SET最多可以有64个不同的成员),而不是字符串,可以把集合看成是多选框,枚举看成是单选

mysql> CREATE TABLE t_set (
letter SET ('a', 'b', 'c', 'd'));
Query OK, 0 rows affected mysql> INSERT INTO t_set VALUES ('a,b');
Query OK, 1 row affected mysql> INSERT INTO t_set VALUES ('a,b,c');
Query OK, 1 row affected

MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索的值的位设置对应组成列值的SET成员,例如,你可以这样从一个SET列检索数值值

mysql> SELECT letter + 0, letter FROM t_set;
+------------+--------+
| letter + 0 | letter |
+------------+--------+
| 3 | a,b |
| 7 | a,b,c |
+------------+--------+
2 rows in set

如果你为该列分配一个值9,其二进制形式为1001,因此第1个和第4个SET值成员'a'和'd'被选择,结果值为 'a,d'。
对于包含多个SET元素的值,当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时,值中的每个元素出现一次,根据表创建时指定的顺序列出元素。例如,插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d'

mysql> INSERT INTO t_set VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected
Records: 5 Duplicates: 0 Warnings: 0 mysql> SELECT letter + 0, letter FROM t_set; -- 检索时所有的值将显示为a,d
+------------+--------+
| letter + 0 | letter |
+------------+--------+
| 3 | a,b |
| 7 | a,b,c |
| 9 | a,d |
| 9 | a,d |
| 9 | a,d |
| 9 | a,d |
| 9 | a,d |
+------------+--------+
7 rows in set

通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:

mysql> SELECT * FROM t_set WHERE FIND_IN_SET('a',letter) > 0; -- 表示找出t_set包含a的成员
+--------+
| letter |
+--------+
| a,b |
| a,b,c |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+--------+
7 rows in set mysql> SELECT * FROM t_set WHERE letter LIKE '%a%'; -- 所有set中包含a的成员,甚至是在另一个SET成员的子字符串中
+--------+
| letter |
+--------+
| a,b |
| a,b,c |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+--------+
7 rows in set

MySQL学习(二) 数据类型的更多相关文章

  1. MySQL学习(二): 数据类型记录

    整形: 浮点型: 日期时间:(使用较少,可能存在跨区域问题) 字符型: CHAR(M):定长,会将位数补充到M位 VARCHAR(M):非定长,最多到达M位 ENUM('v1','v2',...):从 ...

  2. MySQL学习5 - 数据类型二.md

    一 字符类型 二 枚举类型和集合类型 一 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的 ...

  3. mysql学习二、SQL常用数据类型

    一.常用数据类型 二.选择数据类型的原则: 1 业务需要 2 满足第一个条件下,需要存储空间最小的. 三.常用的选择数据类型思路:

  4. 数据库Mysql的学习(二)-数据类型和创建

    数据类型:数据列,存储过程参数,表达式和局部变量的数据特征. 整形: tinyint:一个字节,-128到127:2的7次方 smallint:两个字节,-32768到32767:2的15次方 med ...

  5. MySQL学习4 - 数据类型一

    介绍 一.数值类型 二.浮点型 验证三种类型建表 验证三种类型的精度 三.日期类型 综合练习: 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选 ...

  6. Redis 学习(二) —— 数据类型及操作

    Redis支持string.list.set.zset.hash等数据类型,这一篇学习redis的数据类型.命令及某些使用场景. 一.String,字符串 字符串是 Redis 最基本的数据类型.一个 ...

  7. MySql学习(二) —— where / having / group by / order by / limit 简单查询

    注:该MySql系列博客仅为个人学习笔记. 这篇博客主要记录sql的五种子句查询语法! 一个重要的概念:将字段当做变量看,无论是条件,还是函数,或者查出来的字段. select五种子句 where 条 ...

  8. MySQL学习笔记--数据类型

    一.数据类型(内容参考<SQL学习指南>)不完整 1.文本类型 文本类型 最大字节数 tinytext 255 text 65535 varchar 65536 mediumtext 16 ...

  9. MySQL学习(二)——SQL语句创建删除修改以及中文乱码问题

    一.对数据库的操作 1.创建一个库 create database 库名; 创建带有编码的:create database 库名 character set 编码; 查看编码:show create ...

  10. MYSQL学习笔记——数据类型

    mysql的数据类型可以分为三大类,分别是数值数据类型.字符串数据类型以及日期时间数据类型. 数值数据类型                                               ...

随机推荐

  1. Spring mvc解决url传递中文参数乱码问题

    在tomcat服务器中,修改server.xml参数,如<Connector URIEncoding="UTF-8" connectionTimeout="2000 ...

  2. 使用ILMerge 打包C# 绿色免安装版程序

    使用ILMerge工具,将C#项目debug目录下的exe及其依赖的dll文件打包成一个exe文件,直接双击就可运行. 使用工具: ILMerge :http://www.microsoft.com/ ...

  3. so静态分析进阶练习——一个CreakeMe的分析思路

    i春秋作家:HAI_ 原文来自:https://bbs.ichunqiu.com/thread-41371-1-1.html 说明 拿到一个CreakeMe,写一个分析思路.CreakMe主要是对.s ...

  4. Java异步执行多个HTTP请求的例子(需要apache http类库)

    直接上代码 package org.jivesoftware.spark.util; import java.io.IOException; import java.util.concurrent.C ...

  5. Liferay7 BPM门户开发之20: 理解Asset Framework

    Asset框架用于将您开发的门户内容添加Liferay的核心系统功能.打个比方,你开发了一个事件TodoList管理的插件,在列表显示的时候,你可以集成Asset框架,让你的自定义内容支持Tag标签. ...

  6. vue.js多页面开发环境搭建

    利用 vue-cli 搭建的项目大都是单页面应用项目,对于简单的项目,单页面就能满足要求.但对于有多个子项目的应用,如果创建多个单页面,显示有点重复,特别是 node_modules 会有多份相同的. ...

  7. .NET Core 2.0 Preview 1发布下载和文档

    .NET Core 2.0.0 Preview 1 发布于 2017 5.10. 你可以通过 Visual Studio 2017 Preview 15.3, Visual Studio for Ma ...

  8. SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能

    It's like JSON.but fast and small. MessagePack is an efficient binary serialization format. It lets ...

  9. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  10. SQL 必知必会·笔记<12>组合查询

    什么是组合查询 SQL 通过执行多个查询(多条SELECT 语句),并将结果作为一个查询结果集返回.这些组合查询通常称为并(union)或复合查询(compound query). 什么时候使用组合查 ...