SQL中的数据类型和运算符

数据类型

数值类型

整数类型 字节
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 逻辑异或
位运算符 描述
& 位与
| 位或
^ 位异或
~ 取反
>> 左移
<< 右移
发布了448 篇原创文章 · 获赞 122 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/105527630