Skip to content

环境连接与数据库对象 ​

学习目标 ​

  • 能连接本机 MySQL 并检查实际版本、当前身份和会话设置。
  • 能创建并选择实验库,区分数据库、表、视图和连接。
  • 能用元数据确认对象定义,避免连错环境后直接写数据。

核心知识点 ​

MySQL 8.0 的 mysqld 是服务端,mysql 是命令行客户端;连接建立后产生独立 session。database 与 schema 在 MySQL 中基本同义。表保存数据,普通 view 保存查询定义,并不保存一份查询结果;InnoDB 是本章所有基础表的存储引擎。

本章前提:本机服务监听 127.0.0.1:3306,已配置学习账号 lab_user;其密码由安装时设置,需有实验库建库、建表和视图权限。账号创建与授权留到权限篇。先确认环境再运行 SQL,语句以分号结束,\q 退出客户端。连接错误先区分网络不可达、账号认证失败和权限不足。

常用用法 ​

mysql:建立客户端连接 ​

用于在终端通过 TCP 连接本机实验服务,并在交互提示中输入密码。

shell
# 初始:127.0.0.1:3306 已运行 MySQL,lab_user 已创建。
mysql --host=127.0.0.1 --port=3306 --protocol=TCP --user=lab_user --password --default-character-set=utf8mb4
# 关键变化:认证成功后创建独立连接,进入 mysql> 提示符。
# 输出:终端出现 mysql>,可继续执行 SELECT VERSION()。

不要把密码跟在 --password 后,避免进入进程参数和终端历史;跨机器连接应按环境要求验证 TLS 证书。本命令只连接,不创建账号。官方参考:mysql 客户端。

SELECT:检查服务与会话 ​

用于在开始实验前读取实际版本、连接身份以及当前会话配置。

sql
-- 初始:上面的 lab_user 连接尚未选择数据库。
SELECT VERSION(), CONNECTION_ID(), USER(), CURRENT_USER(), DATABASE();
SELECT @@session.autocommit, @@session.sql_mode, @@session.time_zone,
       @@session.character_set_connection, @@session.collation_connection;
-- 关键变化:读取当前连接配置;DATABASE() 返回 NULL。
-- 结果:第一行显示实际 8.0.x 版本、身份与连接号,当前库为 NULL。

USER() 表示客户端提供的用户名和来源,CURRENT_USER() 是服务器用于权限检查的账号;两者可能不同。版本应是实际 8.0.x,连接号、SQL mode 和时区由环境决定,不应抄一组固定输出。autocommit=1 是默认值,但仍以查询为准。

CREATE DATABASE:建立实验库 ​

用于为本章样例创建独立命名空间并固定默认字符集和排序规则。

sql
-- 初始:learning_lab 尚不存在;本操作需要 CREATE 权限。
CREATE DATABASE learning_lab
  CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SHOW CREATE DATABASE learning_lab;
-- 关键变化:创建 learning_lab,返回定义中包含 utf8mb4。
-- 结果:SHOW CREATE DATABASE 返回 learning_lab 的建库定义。

若库已存在,应先 SHOW CREATE DATABASE 检查,不能用 IF NOT EXISTS 推断旧库配置也符合要求。创建数据库会隐式提交,实验连接中不要夹带未提交的业务事务。参考:CREATE DATABASE。

USE:选择当前数据库 ​

用于给当前连接设置未限定表名的默认数据库。

sql
-- 初始:learning_lab 已创建,当前 DATABASE() 为 NULL。
USE learning_lab;
SELECT DATABASE();
-- 关键变化:当前库变为 learning_lab;输出 learning_lab。
-- 输出:DATABASE() 为 learning_lab。

只影响当前连接;新连接仍需重新指定库。learning_lab.users 是完整限定名,不依赖默认库。DDL 或写入前检查 DATABASE() 能降低误操作概率。

SHOW:检查数据库与表定义 ​

用于查看当前账号可见对象及服务器保存的实际建表语句。

sql
-- 初始:learning_lab 已创建,第二篇的 users 表尚未创建。
SHOW DATABASES LIKE 'learning_lab';
SHOW FULL TABLES FROM learning_lab;
-- 关键变化:读取对象清单;前者返回 learning_lab,后者为空。
-- 输出:数据库列表含 learning_lab,表清单为 Empty set。

完成第二篇后再运行 SHOW CREATE TABLE learning_lab.users; 和 DESCRIBE learning_lab.users;,前者显示引擎、索引和字符集,后者显示列。SHOW DATABASES 的可见范围受权限约束,不代表服务器只有这些库。

CREATE VIEW:保存查询定义 ​

用于把稳定的列投影命名为可查询对象,避免调用方依赖表的所有列。

sql
-- 前置条件:先执行第二篇建表和种子数据,users 含 id=1 的林同学。
CREATE VIEW learning_lab.user_names AS
  SELECT id, username FROM learning_lab.users;
SELECT id, username FROM learning_lab.user_names ORDER BY id;
-- 关键变化:创建 user_names 查询入口;返回 (1, 林同学)、(2, 陈同学)。
-- 输出:按 id 排序得到 1/林同学、2/陈同学。
SHOW CREATE VIEW learning_lab.user_names;

视图不是缓存,也不是自动隔离权限的万能工具;需另行设计 SQL SECURITY、定义者与调用者权限。后续修改基础表可能使视图失效,应审查依赖。参考:CREATE VIEW。

易混点 ​

USE 选择的是数据库,不是账号;连接池中更改 session 后可能影响复用该连接的下一次请求。库默认字符集只为新对象提供默认值,不会自动转换已有列。表名大小写行为受操作系统和 lower_case_table_names 影响,统一使用小写命名,避免跨平台迁移问题。

课后小问 ​

  1. 为什么连接成功还可能无法创建表?

    答:认证确认身份,授权决定可执行操作;缺少对应库的 CREATE 权限仍会失败。

  2. 视图是否会保存建视图时的用户姓名?

    答:普通视图保存查询定义,查询时读取基础表;数据变更后查询结果随之改变。

本节小结 ​

  • 连接前确认地址、端口、账号,连接后确认版本与当前库。
  • session 配置属于当前连接,跨连接不能默认沿用。
  • 数据库提供命名空间,表存数据,视图保存查询定义。

快速回顾 ​

  • mysql --password 使用交互密码输入。
  • SELECT VERSION(), DATABASE() 先确认环境。
  • SHOW CREATE 检查实际对象定义与配置。