MySQL 语言结构和数据类型

1. 实验介绍

1.1 实验内容

在本节内容中,我们将介绍一些 MySQL 的语言结构和 部分 常用的数据类型,为后面课程的学习做一个铺垫。

1.2 实验知识点

  • 数据类型
  • 语言结构

1.3 推荐阅读

FLOAT 与 DOUBLE

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. 总结

本节的内容,我们介绍了一些常用的数据类型,并没有对所有的内容都进行介绍。希望大家能够熟练使用一些常用的内容。

results matching ""

    No results matching ""