初见MySQL——基础篇

First Post:

Last Update:

Word Count:
7.4k

Read Time:
28 min

初见MySQL——基础篇

1.安装MySQL(zip archive)

windows环境下不推荐用安装包安装,之后清理注册表比较麻烦

zip archive website:https://dev.mysql.com/downloads/mysql/

解压之后在文件夹里新建一个my.ini作为配置文件(新版本不自带这个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#my.ini
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql\mysql-8.0.32-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\data

# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# utf8bm4即utf-8
# 创建新表时将使用的默认存储引擎

其中basedirdatadir需要根据解压目录和数据存放地址进行修改,建议在mysql-8.0.32-winx64同级新建一个data文件夹用于存放数据

以管理员身份运行cmd命令,并切换到安装目录下的bin下

初始化MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
mysqld --initialize --console
#Expected output:
#2023-03-06T04:35:17.961027Z 0 [System] [MY-013169] [Server] D:\mysql\mysql-8.0.32-winx64\bin\mysqld.exe (mysqld 8.0.32) #initializing of server in progress as process 23832
#2023-03-06T04:35:17.979526Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
#2023-03-06T04:35:18.172968Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
#2023-03-06T04:35:18.707708Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ************

#Possible errors:
#如果执行后报错:无法启动此程序,因为计算机中丢失VCRUNTIME140_1.dll,尝试重新安装此程序以解决此问题

#Tips:
#*号处是初始密码,需要保存下来

安装MySQL:

1
2
3
mysqld --install
#Expected output:
#Service successfully installed.

登录数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql -u root -p
#Expected output:
#Enter password: ************
#Welcome to the MySQL monitor. Commands end with ; or \g.
#Your MySQL connection id is 9
#Server version: 8.0.32

#Possible errors:
#ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061)
#MySQL服务未开启
#win+r,输入"services.msc"
#找到"MYSQL",右键选择"属性",将"启动类型"改为"自动",点击"服务状态"中的"启动"即可
#ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
#密码输错了,记得是初始密码

修改初始密码:

1
2
3
ALTER USER root@localhost IDENTIFIED BY '********';
#Expected output:
#Query OK, 0 rows affected (0.02 sec)

2.MySQL基础操作

2.1 查看数据库

SQL是一种语言

SQL是一种语言

SQL是一种语言

一定不能忘记加分号,分号说明这条语句结束,每个单词之间记得空格,这里展示所有的数据库,base后面记得加s,ctrl + c可以终止当前输入,mysql中不区分大小写,如果出现以下情况,说明语句未结束,可能是漏了分号

1
2
mysql> show database
->
1
2
3
4
5
6
7
8
9
10
#Expected output:
mysql> show databases;
#+--------------------+
#| Database |
#+--------------------+
#| information_schema |
#| mysql |
#| sys |
#+--------------------+
#4 rows in set (0.01 sec)

2.2 建立数据库

1
create database test1;
1
2
3
4
5
6
7
8
9
10
11
12
13
#Expected output:
#Query OK, 1 row affected (0.01 sec)
mysql> show databases;
#+--------------------+
#| Database |
#+--------------------+
#| information_schema |
#| mysql |
#| performance_schema |
#| sys |
#| test1 |
#+--------------------+
#5 rows in set (0.00 sec)

2.3 数据库语句分类

2.3.1 DQL(数据查询语言)

数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。

1
#我们在看到select…这样的sql语句,都是数据查询语句,凡是带有select关键字的SQL语句都是DQL语句

2.3.2 DML(数据操纵语言)

  数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

1
2
3
4
#凡是带有INSERT、UPDATE、DELETE关键字的语句都是DML
#insert —— 插入,等同于增
#update —— 更新,等同修改
#delete —— 删除

​ 这个主要操作的是表中的数据

2.3.3 DDL(数据定义语言)

  数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由creat、alter 与 drop 三个语法所组成. DDL 主要操作的是 表的结构 不是表中的数据

1
2
3
4
#凡是带有 create(增)、alter(改)、drop(删)关键字的语句都是DDL
#create —— 新建、等同于增
#drop —— 删除
#alter —— 修改

​ 这个增删改与 DML 有所不同,这个主要是对表结构进行操作.

2.3.4 DCL(数据控制语言)

  数据控制语言 (Data Control Language) 在SQL语言中,是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。对数据的权限进行控制的语言.

1
2
#请求授权—— grant
#撤销授权 —— revoke

2.3.5 TCL(事务处理语言)

  这里的TCL可不是王牌电视,事务处理语言(Transaction Control Language),它的语句能确保被DML语句影响的表的所有行及时得以更新。是一种事务控制语言。

1
2
#事务提交 —— commit
#事务回滚 —— rollback

2.4 数据库的分类

2.4.1 关系型数据库

Mysql、Sql server、Oracle 、SqLite属于关系型数据库

把数据按照 表 的形式来进行组织(类似于Excel这种形式的),关系型数据库能够对数据进行更严格的校验,带来更好的数据的完整性

2.4.2 非关系型数据库

Redis、HBase 、MongoDB属于非关系型数据库

把数据按照 文档 的形式来进行组织,文档和文档之间的差别可以较大,更灵活的组织数据,效率更高,更容易在分布式环境下使用


2.5 什么是表

表是组织数据的一种形式,类似于Excel中的表格

数据库中是以 表格的形式来表示数据的,因为表格比较直观,任何表都有行和列

行(row): 被称为数据/ 记录

列(column): 被称为字段

每个字段都有字段名数据类型约束条件等属性

字段名:只是一个普通的名字,见名知意就行了

数据类型: 字符串类型,数字、日期等类型,在后面我们会详细介绍

约束:约束也有很多,其中有一个叫做唯一性约束,这种约束添加后,该字段的数据不能重复

2.5.1 查看数据库中的表

1
use test1;
1
2
#Expected output:
#Database changed
1
show tables;
1
2
3
4
5
6
7
8
9
#Expected output:
#+--------------------+
#| Database in test1 |
#+--------------------+
#| article |
#| res |
#| name |
#+--------------------+
#3 rows in set (0.00 sec)

2.6 数据库操作

2.6.1 显示当前的数据库

1
show databases;
1
2
3
4
5
6
7
8
9
#Expected output:
#+--------------------+
#| Database |
#+--------------------+
#| information_schema |
#| mysql |
#| sys |
#+--------------------+
#4 rows in set (0.01 sec)

2.6.2 创建数据库

1
create database [name];
1
2
3
4
5
6
7
8
9
10
11
12
13
#Expected output:
#Query OK, 1 row affected (0.01 sec)
mysql> show databases;
#+--------------------+
#| Database |
#+--------------------+
#| information_schema |
#| mysql |
#| performance_schema |
#| sys |
#| name |
#+--------------------+
#5 rows in set (0.00 sec)

语法:

1
2
3
4
5
6
7
8
9
10
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification] [,create_specification] ...]

create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name

#大写的表示是关键字
#[]是可选项
#CHARACTER SET:指定数据库采用的字符集
#COLLATE:指定数据库字符集的校验规则

2.6.3 选中/使用数据库

1
use [name];
1
2
#Expected output:
#Database changed

2.6.4 删除数据库

1
drop database [name];

语法:

1
DROP DATABASE [IF EXISTS] db_name
1
2
#Expected output:
#Query OK, 0 row affected (0.00 sec)

一旦删除数据库,这里的数据通过常规的手段就找不回来了!!!所以删除数据库是一个非常危险的操作!!在工作中,无论如何都不要使用drop database操作,尤其是针对线上环境~

2.7 数据类型

数据类型(data_type)是指系统中所允许的数据的类型。数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据。例如,列中存储的为数字,则相应的数据类型应该为数值类型。

如果使用错误的数据类型可能会严重影响应用程序的功能和性能,所以在设计表时,应该特别重视数据列所用的数据类型。更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。

MySQL 的数据类型有大概可以分为整数类型、浮点数类型和定点数类型、日期和时间类型、字符串类型、二进制类型等。

注意: 整数类型和浮点数类型可以统称为数值数据类型。

  • 数值类型:整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型包括 FLOAT 和 DOUBLE,定点数类型为 DECIMAL。
  • 日期/时间类型:包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
  • 字符串类型:包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
  • 二进制类型:包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

2.7.1 数值类型

整数类型

MySQL 主要提供的整数类型有 TINYINTSMALLINTMEDIUMINTINTBIGINT,其属性字段可以添加 AUTO_INCREMENT 自增约束条件。

1

从上表中可以看到,不同类型的整数存储所需的字节数不相同,占用字节数最小的是 TINYINT 类型,占用字节最大的是 BIGINT 类型,占用的字节越多的类型所能表示的数值范围越大。

根据占用字节数可以求出每一种数据类型的取值范围。例如,TINYINT 需要 1 个字节(8bit)来存储,那么 TINYINT 无符号数的最大值为 28-1,即 255;TINYINT 有符号数的最大值为 27-1,即 127。其他类型的整数的取值范围计算方法相同,如下表所示。

2

提示: 显示宽度和数据类型的取值范围是无关的。显示宽度只是指明 MySQL 最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充。如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,year 字段插入 19999,当使用 SELECT 查询该列值的时候,MySQL 显示的将是完整的带有 5 位数字的 19999,而不是 4 位数字的值。

其他整型数据类型也可以在定义表结构时指定所需的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。

不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。

浮点类型

MySQL 中使用浮点数和定点数来表示小数。

浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是 DECIMAL

浮点类型和定点类型都可以用(M, D)来表示,其中 M 称为精度,表示总共的位数;D 称为标度,表示小数的位数。

浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。

下表中列出了 MySQL 中的小数类型和存储需求。

3

DECIMAL 类型不同于 FLOATDOUBLEDOUBLE 实际上是以字符串的形式存放的,DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 MD 决定。如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。

从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。

FLOAT 类型的取值范围如下:

  • 有符号的取值范围:-3.402823466E+38~-1.175494351E-38。
  • 无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38。

DOUBLE 类型的取值范围如下:

  • 有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。
  • 无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。

提示:

  • 不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
  • FLOATDOUBLE 在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL 如果不指定精度,默认为(10,0)。
  • 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。
  • 在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好
  • 另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

2.7.2 日期和时间类型

MySQL 中有多处表示日期的数据类型:YEARTIMEDATEDTAETIMETIMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。

每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。

4

YEAR 类型

YEAR 类型是一个单字节类型,用于表示年,在存储时只需要 1 个字节。可以使用各种格式指定 YEAR,如下所示:

  • 4 位字符串或者 4 位数字格式表示的 YEAR,范围为 ‘1901’~’2155’。输入格式为 ‘YYYY’ 或者 YYYY,例如,输入 ‘2010’ 或 2010,插入数据库的值均为 2010。
  • 2 位字符串格式表示的 YEAR,范围为 ‘00’ 到 ‘99’。’00’~’69’ 和 ‘70’~’99’ 范围的值分别被转换为 2000~2069 和 1970~1999 范围的 YEAR 值。’0’ 与 ‘00’ 的作用相同。插入超过取值范围的值将被转换为 2000。
  • 2 位数字表示的 YEAR,范围为 1~99。1~99 和 70~99 范围的值分别被转换为 2001~2069 和 1970~1999 范围的 YEAR 值。注意,在这里 0 值将被转换为 0000,而不是 2000。

提示: 两位整数范围与两位字符串范围稍有不同。例如,插入 3000 年,读者可能会使用数字格式的 0 表示 YEAR,实际上,插入数据库的值为 0000,而不是所希望的 3000。只有使用字符串格式的 ‘0’ 或 ‘00’,才可以被正确解释为 3000,非法 YEAR值将被转换为 0000。

TIME 类型

TIME 类型用于只需要时间信息的值,在存储时需要 3 个字节。格式为 HH:MM:SSHH 表示小时,MM 表示分钟,SS 表示秒。

TIME 类型的取值范围为 -838:59:59~838:59:59,小时部分如此大的原因是 TIME 类型不仅可以用于表示一天的时间(必须小于 24 小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可大于 24 小时,或者甚至为负)。

可以使用各种格式指定 TIME 值,如下所示。

  • D HH:MM:SS‘ 格式的字符串。还可以使用这些“非严格”的语法:’HH:MM:SS‘、’HH:MM‘、’D HH‘ 或 ‘SS‘。这里的 D 表示日,可以取 0~34 之间的值。在插入数据库时,D 被转换为小时保存,格式为 “D*24+HH”。
  • HHMMSS‘ 格式、没有间隔符的字符串或者 HHMMSS 格式的数值,假定是有意义的时间。例如,’101112’ 被理解为’10:11:12’,但是 ‘106112’ 是不合法的(它有一个没有意义的分钟部分),在存储时将变为 00:00:00。

为 TIME 列分配简写值时应注意:

  • 如果没有冒号,MySQL 解释值时,假定最右边的两位表示秒。(MySQL 解释 TIME 值为过去的时间而不是当前的时间)。例如,读者可能认为 ‘1112’ 和 1112 表示 11:12:00(即 11 点过 12 分钟),但MySQL 将它们解释为 00:11:12(即 11 分 12 秒)。同样 ‘12’ 和 12 被解释为00:00:12。
  • 相反,TIME 值中如果使用冒号则肯定被看作当天的时间,也就是说,’11:12’ 表示 11:12:00,而不是 00:11:12。

DATE 类型

DATE 类型用于仅需要日期值时,没有时间部分,在存储时需要 3 个字节。日期格式为 ‘YYYY-MM-DD‘,其中 YYYY 表示年,MM 表示月,DD 表示日。

在给 DATE 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATE 的日期格式即可。如下所示:

  • 以 ‘YYYY-MM-DD‘ 或者 ‘YYYYMMDD‘ 字符中格式表示的日期,取值范围为 ‘1000-01-01’~’9999-12-3’。例如,输入 ‘2015-12-31’ 或者 ‘20151231’,插入数据库的日期为2015-12-31。
  • 以 ‘YY-MM-DD‘ 或者 ‘YYMMDD‘ 字符串格式表示日期,在这里YY表示两位的年值。MySQL 解释两位年值的规则:’00~69’ 范围的年值转换为 ‘2000-2069’,’70-99’ 范围的年值转换为 ‘1970~1999’。例如,输入 ‘15-12-31’,插入数据库的日期为 2015-12-31;输入 ‘991231’,插入数据库的日期为 1999-12-31。
  • YYMMDD 数字格式表示的日期,与前面相似,00~69 范围的年值转换为 2000~2069,80~99 范围的年值转换为 1980~1999。例如,输入 151231,插入数据库的日期为 2015-12-31,输入 991231,插入数据库的日期为 1999-12-31。
  • 使用 CURRENT_DATE 或者 NOW(),插入当前系统日期。

MySQL 允许“不严格”语法: 任何标点符号都可以用作日期部分之间的间隔符。例如,’98-11-31’、’98.11.31’、’98/11/31’和’98@11@31’ 是等价的,这些值也可以正确地插入数据库。

DATETIME 类型

DATETIME 类型用于需要同时包含日期和时间信息的值,在存储时需要 8 个字节。日期格式为 ‘YYYY-MM-DD HH:MM:SS‘,其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒。

在给 DATETIME 类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合 DATETIME 的日期格式即可,如下所示。

  • 以 ‘YYYY-MM-DD HH:MM:SS‘ 或者 ‘YYYYMMDDHHMMSS‘ 字符串格式表示的日期,取值范围为 ‘1000-01-01 00:00:00’~’9999-12-3 23:59:59’。例如,输入 ‘2014-12-31 05:05:05’ 或者 ‘20141231050505’,插入数据库的 DATETIME 值都为 2014-12-31 05:05:05。
  • 以 ‘YY-MM-DD HH:MM:SS‘ 或者 ‘YYMMDDHHMMSS‘ 字符串格式表示的日期,在这里 YY 表示两位的年值。与前面相同,’00~79’ 范围的年值转换为 ‘2000~2079’,’80~99’ 范围的年值转换为 ‘1980~1999’。例如,输入 ‘14-12-31 05:05:05’,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。
  • YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 数字格式表示的日期和时间。例如,输入 20141231050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05;输入 140505050505,插入数据库的 DATETIME 为 2014-12-31 05:05:05。

MySQL 允许“不严格”语法: 任何标点符号都可用作日期部分或时间部分之间的间隔符。例如,’98-12-31 11:30:45’、’98.12.31 11+30+35’、’98/12/31 113045’ 和 ‘98@12@31 11^30^45’ 是等价的,这些值都可以正确地插入数据库。

TIMESTAMP 类型

TIMESTAMP 的显示格式与 DATETIME 相同,显示宽度固定在 19 个字符,日期格式为 YYYY-MM-DD HH:MM:SS,在存储时需要 4 个字节。但是 TIMESTAMP 列的取值范围小于 DATETIME 的取值范围,为 ‘1970-01-01 00:00:01’UTC~’2038-01-19 03:14:07’UTC。在插入数据时,要保证在合法的取值范围内。

提示: 协调世界时(英:Coordinated Universal Time,法:Temps Universel Coordonné)又称为世界统一时间、世界标准时间、国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称 UTC。

TIMESTAMPDATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:

  • DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
  • 而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。

提示: 如果为一个 DATETIMETIMESTAMP 对象分配一个 DATE 值,结果值的时间部分被设置为 ‘00:00:00’,因此 DATE 值未包含时间信息。如果为一个 DATE 对象分配一个 DATETIME 或 TIMESTAMP 值,结果值的时间部分被删除,因此DATE 值未包含时间信息。


2.7.3 字符串类型

字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。

MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。

下表中列出了 MySQL 中的字符串数据类型,括号中的 M 表示可以为其指定长度。

5

VARCHARTEXT 类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用 L 表示),而不是取决于类型的最大可能尺寸。

例如,一个 VARCHAR(10) 列能保存一个最大长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上一个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,而存储要求 5 个字节。

CHAR 和 VARCHAR 类型

CHAR(M) 为固定长度字符串,在定义时指定字符串列长。当保存时,在右侧填充空格以达到指定的长度。M 表示列的长度,范围是 0~255 个字符。

例如,CHAR(4) 定义了一个固定长度的字符串列,包含的字符个数最大为 4。当检索到 CHAR 值时,尾部的空格将被删除。

VARCHAR(M) 是长度可变的字符串,M 表示最大列的长度,M 的范围是 0~65535VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。

例如,VARCHAR(50) 定义了一个最大长度为 50 的字符串,如果插入的字符串只有 10 个字符,则实际存储的字符串为 10 个字符和一个字符串结束字符。VARCHAR 在值保存和检索时尾部的空格仍保留。

实例: 下面将不同的字符串保存到 CHAR(4)VARCHAR(4) 列,说明 CHARVARCHAR 之间的差别,如下表所示。

6

对比结果可以看到,CHAR(4) 定义了固定长度为 4 的列,无论存入的数据长度为多少,所占用的空间均为 4 个字节。VARCHAR(4) 定义的列所占的字节数为实际长度加 1。

TEXT 类型

TEXT 列保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。

TEXT 类型分为 4 种:TINYTEXTTEXTMEDIUMTEXTLONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。

  • TINYTEXT 表示长度为 255字符的 TEXT 列。
  • TEXT 表示长度为 65535字符的 TEXT 列。
  • MEDIUMTEXT 表示长度为 16777215字符的 TEXT 列。
  • LONGTEXT 表示长度为 4294967295 或 4GB 字符的 TEXT 列。
ENUM 类型

ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。其语法格式如下:

1
<字段名> ENUM( '值1', '值1', …, '值n' )

字段名指将要定义的字段,值 n 指枚举列表中第 n 个值。

ENUM 类型的字段在取值时,能在指定的枚举列表中获取,而且一次只能取一个。如果创建的成员中有空格,尾部的空格将自动被删除。

ENUM 值在内部用整数表示,每个枚举值均有一个索引值;列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号,枚举最多可以有 65535 个元素。

例如,定义 ENUM 类型的列(’first’,’second’,’third’),该列可以取的值和每个值的索引如下表所示。

7

ENUM 值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚举值前。

提示: ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULLNULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。

SET 类型

SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用逗号,隔开,语法格式如下:

1
SET( '值1', '值2', …, '值n' )

与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。

但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。

提示: 如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。


2.7.4 二进制类型

MySQL 支持两类字符型数据:文本字符串和二进制字符串。二进制字符串类型有时候也直接被称为“二进制类型”。

MySQL 中的二进制字符串有 BITBINARYVARBINARYTINYBLOBBLOBMEDIUMBLOBLONGBLOB

下表中列出了 MySQL 中的二进制数据类型,括号中的 M 表示可以为其指定长度。

8

BIT 类型

位字段类型。M 表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充。例如,为 BIT(6) 列分配一个值 b’101’,其效果与分配 b’000101’ 相同。

BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入BIT(4) 类型的字段中的。

提示: 默认情况下,MySQL 不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定的范围内。

BINARY 和 VARBINARY 类型

BINARYVARBINARY 类型类似于 CHARVARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下:

1
列名称 BINARY(M) 或者 VARBINARY(M)

BINARY 类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充 “\0” 补齐,以达到指定长度。例如,指定列数据类型为 BINARY(3),当插入 a 时,存储的内容实际为 “\a0\0”,当插入 ab 时,实际存储的内容为“ab\0”,无论存储的内容是否达到指定的长度,存储空间均为指定的值 M

VARBINARY 类型的长度是可变的,指定好长度之后,长度可以在 0 到最大值之间。例如,指定列数据类型为 VARBINARY(20),如果插入的值长度只有 10,则实际存储空间为 10 加 1,实际占用的空间为字符串的实际长度加 1。

BLOB 类型

BLOB 是一个二进制的对象,用来存储可变数量的数据。BLOB 类型分为 4 种:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB,它们可容纳值的最大长度不同,如下表所示。

9

  • BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。
  • BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。

https://mp.weixin.qq.com/s?__biz=MzA5NzQxOTE4NA==&mid=2247484005&idx=1&sn=9cfc06b6605cfc10056971a745e400e2&chksm=90a068baa7d7e1ac5f14f0b42d54ebb8effc1b1e9bb6035f22ea1eb6d2ad2dcfd35fc6323e0b&scene=27

2.8 表的操作

需要操作数据库中的表时,需要先使用该数据库

1
use db_test;

2.8.1 查看表结构

1
desc [name]

表结构的具体解释:

表结构的具体解释

2.8.2 创建表

1
create table table_name(datatype1,datatype2,...);

2.8.3 删除表

1
drop table table_name;

语法:

1
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
reward
Alipay
Wechat