数据类型
数值类型
整数类型 | 字节 |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT、INTEGER | 4 |
BIGINT | 8 |
浮点数类型 | |
FLOAT | 4 |
DOUBLE | 8 |
定点数类型 | |
DEC(M,D) | M+2 |
DECIMAL(M,D) | M+2 |
位类型 | |
BIT(M) | 1~8 |
时间日期类型
日期和时间类型 | 字节 | 描述 | 零值表示 |
---|---|---|---|
DATE | 4 | 年月日 | 0000-00-00 |
DATETIME | 8 | 年月日时分秒 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 当前系统时间 | 00000000000000 |
TIME | 3 | 时分秒 | 00:00:00 |
YEAR | 1 | 年 | 0000 |
mysql> CREATE TABLE TEST (D DATE, T TIME, DT DATETIME, TS TIMESTAMP,Y YEAR);
Query OK, 0 rows affected (0.03 sec)
mysql> DESC TEST;
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| D | date | YES | | NULL | |
| T | time | YES | | NULL | |
| DT | datetime | YES | | NULL | |
| TS | timestamp | YES | | NULL | |
| Y | year | YES | | NULL | |
+-------+-----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> INSERT INTO TEST VALUES(NOW(), NOW(), NOW(), NOW(), NOW());
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> SELECT * FROM TEST;
+------------+----------+---------------------+---------------------+------+
| D | T | DT | TS | Y |
+------------+----------+---------------------+---------------------+------+
| 2020-04-15 | 08:35:42 | 2020-04-15 08:35:42 | 2020-04-15 08:35:42 | 2020 |
+------------+----------+---------------------+---------------------+------+
1 row in set (0.00 sec)
字符串类型
字符串类型 | 描述 |
---|---|
CHAR(M) | 固定长度的字符串。最多 8,000 个字符 |
VARCHAR(M) | 可变长度的字符串。最多 8,000 个字符 |
TINYBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 255 字节的数据 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据 |
TINYTEXT | 存放最大长度为 255 个字符的字符串 |
TEXT | 可变长度的字符串。最多 2GB 字符数据 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串 |
VARBINARY(M) | 可变长度的字符串。最多 2GB 字符数据 |
BINARY(M) | 固定长度的二进制数据。最多 8,000 字节 |
-
CHAR和VARCHAR的区别:两者的区别在于存储方式的不同,CHAR列的长度固定为创建表声明时的长度,VARCHAR列中的值为可变长字符串;在检索的时候,CHAR会删除尾部的空格,而VARCHAR则会保留尾部的空格。
mysql> CREATE TABLE STRING (C CHAR(5),V VARCHAR(5)); Query OK, 0 rows affected (0.04 sec) mysql> DESC STRING; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | C | char(5) | YES | | NULL | | | V | varchar(5) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> INSERT INTO STRING VALUES('111', '111'); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM STRING; +------+------+ | C | V | +------+------+ | 111 | 111 | +------+------+ 1 row in set (0.00 sec) mysql> INSERT INTO STRING VALUES('1111111111', '1111111111'); ERROR 1406 (22001): Data too long for column 'C' at row 1
-
BINARY和VARBINARY:它们类似于CHAR和VARCHAR,不同之处在于它们存储的是二进制字符串。
mysql> CREATE TABLE T (B BINARY(3)); Query OK, 0 rows affected (0.04 sec) mysql> DESC T; +-------+-----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------+-------+ | B | binary(3) | YES | | NULL | | +-------+-----------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> INSERT INTO T SET B = 'a'; Query OK, 1 row affected (0.01 sec) mysql> SELECT *, HEX(B), B='a', B='a\0', B='a\0\0' FROM T; +------------+--------+-------+---------+-----------+ | B | HEX(B) | B='a' | B='a\0' | B='a\0\0' | +------------+--------+-------+---------+-----------+ | 0x610000 | 610000 | 0 | 0 | 1 | +------------+--------+-------+---------+-----------+ 1 row in set (0.01 sec)
-
ENUM:ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。可以插入空字符串""和NULL:
- 如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。
- 如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。
mysql> CREATE TABLE SHIRTS(NAME VARCHAR(20), SIZE ENUM('X-SAMALL', 'SMALL','MEDIUM', 'LARGE')); Query OK, 0 rows affected (0.04 sec) mysql> DESC SHIRTS; +-------+-------------------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------------------------------------+------+-----+---------+-------+ | NAME | varchar(20) | YES | | NULL | | | SIZE | enum('X-SAMALL','SMALL','MEDIUM','LARGE') | YES | | NULL | | +-------+-------------------------------------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> INSERT INTO SHIRTS VALUES('DRESS','LARGE'); Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM SHIRTS; +-------+-------+ | NAME | SIZE | +-------+-------+ | DRESS | LARGE | +-------+-------+ 1 row in set (0.00 sec)
-
SET:SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。
mysql> INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); Query OK, 5 rows affected (0.02 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM MYSET; +------+ | col | +------+ | a,d | | a,d | | a,d | | a,d | | a,d | +------+ 5 rows in set (0.00 sec)
运算符
算数运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/,DIV | 除 |
%, MOD | 取余 |
比较运算符 | 描述 |
= | 等于 |
!=, <> | 不等于 |
<=> | NULL安全的等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 存在于指定范围 |
IN | 存在于指定集合 |
IS NULL | 为NULL |
IS NOT NULL | 不为NULL |
LIKE | 通配符匹配 |
REGEXP, RLIKE | 正则表达式匹配 |
逻辑运算符 | 描述 |
NOT, ! | 逻辑非 |
&&, AND | 逻辑与 |
||, OR | 逻辑或 |
XOR | 逻辑异或 |
位运算符 | 描述 |
& | 位与 |
| | 位或 |
^ | 位异或 |
~ | 取反 |
>> | 左移 |
<< | 右移 |