MySQL 语言结构和数据类型
1. 实验介绍
1.1 实验内容
在本节内容中,我们将介绍一些 MySQL 的语言结构和 部分 常用的数据类型,为后面课程的学习做一个铺垫。
1.2 实验知识点
- 数据类型
- 语言结构
1.3 推荐阅读
2. 数据类型
在这里需要说明的是,我们所讲的数据类型针对于实验环境中 MySQL 版本所采用的数据类型的部分内容。
首先,我们需要连接到服务器,并且选择我们上一节课程中创建的名为 shiyanlou001 的数据库。
2.1 字符串
CHAR,VARCHAR,TEXT 和 BLOB CHAR 和 VARCHAR 类型类似。长度都代表着可以存储的最大字符数,例如 CHAR(30) 代表可以容纳 30 个字符。
不同的是 CHAR 的长度为 0~255 之间,并且 CHAR 类型的字符串的长度是固定的,当保存数据长度不够设置时会自动填充空格,而超出长度的数据则会丢失。
VARCHAR 则属于变长字符串,意思是根据需要保存数据的大小进行存储,小于设定的长度时并不会自动填充,超出也会丢失,它也有对应的长度范围,为 0~65535。
但是一个 VARCHAR 字符串的有效最大值会受到行大小,以及使用的字符集的限制
TEXT 和 BLOB 类似,但是 TEXT 不需要指定长度。而 BLOB 用来保存二进制的数据,例如可以用来保存图片,音乐等。
这里我们创建一个表,指定三个字段,数据类型分别为 CHAR ,VARCHAR 和 TEXT (关于创建表,插入,查询的操作在后面的内容中,我们会详细讲到)
# 这里我们创建了表 test1 ,有三个列,分别对应不同的格式,并且char 和 VARCHAR 指定长度为 5
mysql> CREATE TABLE test1(field1 CHAR(5), field2 VARCHAR(5), field3 TEXT);
Query OK, 0 rows affected (0.49 sec)
# 这时我们分别插入两条数据
mysql> INSERT INTO test1 VALUES("1234567890","1234567890","1234567890");
Query OK, 1 row affected, 2 warnings (1.52 sec)
mysql> INSERT INTO test1 VALUES("123","123","123");
Query OK, 1 row affected (0.52 sec)
# 打印表 test1 的数据
mysql> SELECT * FROM test1;
+--------+--------+------------+
| field1 | field2 | field3 |
+--------+--------+------------+
| 12345 | 12345 | 1234567890 |
| 123 | 123 | 123 |
+--------+--------+------------+
2 rows in set (0.00 sec)
如上所示,我们设置长度为 5时,CHAR 和 VARCHAR 数据类型的多余内容将会被抛弃。
ENUM 和 SET ENUM 我们一般称为枚举,SET 则被称为集合。两者都是从一个预先定义好的值列表中取值。除了列表中允许的取值之外,还包括 NULL 和空字符串 ''。
下面我们简单描述两者的区别
- 取值范围来说,ENUM 比 SET 大的多,ENUM 列理论上最多可以有 65535 个截然不同的值,但是实际上一般不到 3000 个,而 SET 只有 64 个。
- 在一条记录中,ENUM 只能从中取一个值,但是 SET 可以有多个。因此,即使 ENUM 和 SET 的值都属于字符串,但是 SET 的成员不能包含逗号 (,) 字符。因为 SET 多个成员使用逗号 (,) 分隔。
如下示例,我们创建一张表
# 创建一个表 test2 包含有两列,分别为 ENUM 和 SET
mysql> CREATE TABLE test2(field1 ENUM("a", "b", "c"), field2 SET("001", "002", "003"));
Query OK, 0 rows affected (0.03 sec)
# 分别向表中插入数据
mysql> INSERT INTO test2 VALUES("a","001");
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO test2 VALUES("b","002,003");
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO test2 VALUES("shiyanlou","002,004");
Query OK, 1 row affected, 1 warning (0.02 sec)
# 查询表 test2
mysql> SELECT * FROM test2;
+--------+---------+
| field1 | field2 |
+--------+---------+
| a | 001 |
| b | 002,003 |
| | 002 |
+--------+---------+
3 rows in set (0.00 sec)
mysql>
如上所示,插入不包括在变量中的值列表的值时,该值被设定为空字符串 ''。并且 set 的多个成员之间使用逗号(,)分隔。
2.2 数字
整型 整型即整数,可以分为有符号和无符号两类,无符号代表为非负的整数。
类型 | 存储(字节) | 最小值(符号/无符号) | 最大值(符号/无符号) |
---|---|---|---|
TINYINT | 1 | -128/0 | 127/255 |
SMALLINT | 2 | -32768/0 | 32767/65535 |
MEDIUMINT | 3 | -8388608/0 | 8388607/16777215 |
INT/INTEGER | 4 | -214748363648/0 | 2147483647/4294967295 |
... | ... | ... | ... |
DECIMAL DECIMAL 作为一种数字类型可以精确地划分整数和小数部分的位数。
DECIMAL(a,b)
a 指定整数部分和小数部分一共可以存储的十进制数字的最大位数,最大值为 65,但是会受限于操作系统等因素。
b 指定小数点后可以存储的十进制数字的最大位数。小数位数必须是从 0 到 a 之间的值。默认小数位数是 0。
如:123.45,则 a=5,b=2。
例如 DECIMAL(3,2),取值范围为 -9.99 ~ 9.99。
FLOAT 和 DOUBLE FLOAT 和 DOUBLE 分别使用 4 和 8 个字节进行存储。要知道的是,他们代表的是数字的近似值。
在计算机中浮点型数据在存储的时候,必须转化成二进制,而转换成二进制之后浮点数的存储主要分为:
- 符号位
- 指数位
- 尾数
FLOAT 使用 4 个字节存储,所以其有 32 位的空间,而 DOUBLE 使用 8 个字节存储,所以其有 64 位的空间,其存储空间的分配如下:
类型 | 符号位 | 指数位 | 尾数 |
---|---|---|---|
float | 1 | 8 | 23 |
double | 1 | 11 | 52 |
具体的存储内容与使用大家可以参看推荐阅读中的 FLOAT 与 DOUBLE
简单来说三种浮点数类型的选用:
- FLOAT:用于较小的精度,容忍精度的丢失
- DOUBLE:主要用于工程项目,对进度要求更高的控制
- DECIMAL:主要用于科学的计算,与对精度更高要求的金融数据库
BOOL BOOL 或者同义词 BOOLEAN 。在存储时表现为 0 或者 1。
0 值被视为假(False)。非 0 值视为真(True)。
2.3 日期和时间
日期 DATE 支持的范围为 '1000-01-01'到 '9999-12-31'。MySQL 以 YYYY-MM-DD 格式显示 DATE 值,例如 2018-01-01 代表 2018 年 1 月 1 日。但允许使用字符串或数字类型数据为 DATE 列赋值(在下面的语言结构会演示相应的示例)。
时间 TIME 时间。范围是 -838:59:59 到 838:59:59。MySQL 以 HH:MM:SS 格式或者 HHH:MM:SS 格式显示 TIME 值,但允许使用字符串或数字为 TIME 列分配值。
TIME 的小时范围较大,因为其不仅可以表示 24 小时制的时间,还可以表示两个事件发生的事件间隔
DATETIME 日期和时间的组合。支持的范围是 1000-01-01 00:00:00 到 9999-12-31 23:59:59
3. 语言结构
在语言结构部分我们将简单示例一些数据在 MySQL 中的表现形式,以及使用方法。
语言结构跟数据类型的区别,类似于我们自己使用的 SQL 语句,与 MySQL 进行解析优化后的 SQL 语句
3.1 文字
文字部分我们将描述上述的数据结构在 MySQL 中的表现形式。
字符串 MySQL 中字符串指使用单引号和双引号的字符序列。
在字符串中,部分序列具有特殊含义。
序列 | 值 |
---|---|
\n | 换行符 |
\r | 回车符 |
\t | tab 字符 |
... | ... |
例如使用 \t:
mysql> SELECT "shiyan\tlou";
+------------+
| shiyan lou |
+------------+
| shiyan lou |
+------------+
1 row in set (0.00 sec)
mysql>
数字 数值与我们平时使用的数字没有什么区别。MySQL 中可以使用科学记数法,如下示例:
mysql> SELECT true, false, TRUE, FALSE, 100, -100, 1.2e+3, 2.67;
+------+-------+------+-------+-----+------+--------+------+
| TRUE | FALSE | TRUE | FALSE | 100 | -100 | 1.2e+3 | 2.67 |
+------+-------+------+-------+-----+------+--------+------+
| 1 | 0 | 1 | 0 | 100 | -100 | 1200 | 2.67 |
+------+-------+------+-------+-----+------+--------+------+
1 row in set (0.00 sec)
日期 时间和日期可以使用多种格式,MySQL 会将其进行解释,统一为一种格式,即日期为 YYYY-MM-DD,时间为 HH:MM:SS,如下示例。
mysql> SELECT DATE("11111111");
+------------------+
| DATE("11111111") |
+------------------+
| 1111-11-11 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE("1111-11-11");
+--------------------+
| DATE("1111-11-11") |
+--------------------+
| 1111-11-11 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE("1111:11:11");
+--------------------+
| DATE("1111:11:11") |
+--------------------+
| 1111-11-11 |
+--------------------+
1 row in set (0.00 sec)
mysql>
时间 如下示例
# HH:MM:SS
mysql> SELECT TIME("111111");
+----------------+
| TIME("111111") |
+----------------+
| 11:11:11 |
+----------------+
1 row in set (0.00 sec)
# HH:MM:SS
mysql> SELECT TIME("1111");
+--------------+
| TIME("1111") |
+--------------+
| 00:11:11 |
+--------------+
1 row in set (0.00 sec)
# HH:MM:SS
mysql> SELECT TIME("11");
+------------+
| TIME("11") |
+------------+
| 00:00:11 |
+------------+
1 row in set (0.00 sec)
# D HH:MM:SS 这里的 D 代表天数,将会被转换成 HH:MM:SS
mysql> SELECT TIME("1 11:");
+---------------+
| TIME("1 11:") |
+---------------+
| 35:00:00 |
+---------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT TIME("1 11:11");
+-----------------+
| TIME("1 11:11") |
+-----------------+
| 35:11:00 |
+-----------------+
1 row in set (0.00 sec)
mysql>
时间和日期 时间和日期的组合方式,这里不再举例。参考上述时间和日期的单独示例。
3.2 识别符
数据库名、表名、列名,及数据表,列的别名等被称作识别符。 反引号(`)一般用于与识别符与 MySQL 关键字冲突时使用。 我们查看创建语句时,会自动给数据库名和表名等添加反引号。
例如我们创建一个名为 database 的数据表,就可以使用反引号:
mysql> CREATE TABLE database(name CHAR);
Query OK, 0 rows affected (0.37 sec)
3.3 注释语句
MySQL 服务器支持 3 种注释风格:
以 # 字符开始到行尾。
以 -- 符号序列开始到行尾。请注意 -- (双破折号)注释风格要求第 2 个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。该语法与标准 SQL注释语法稍有不同。
以 / 序列开始到 / 序列结束。结束序列不一定在同一行中,因此该语句允许注释跨越多行。
下面的例子显示了3种风格的注释:
mysql> SELECT 1+1; # shiyanlou
mysql> SELECT 1+1; -- shiyanlou
mysql> SELECT 1 /* shiyanlou */ + 1;
mysql> SELECT 1+
/*
shiyan
lou
*/
1;
4. 总结
本节的内容,我们介绍了一些常用的数据类型,并没有对所有的内容都进行介绍。希望大家能够熟练使用一些常用的内容。