MySQL 起步与命令 SQL:连接、建库和基本读写
本轮仅全文静态审计,未安装依赖、启动服务、连接数据库或执行任何示例。下文实测、RED/GREEN及平台结果均为此前历史证据;本轮修改后的脚本未运行,命令与输出作为学习步骤和预期保留。
版本、终端与实验边界
MySQL是保存关系表并执行SQL的服务端;mysql是向服务端发请求的客户端。安装Python驱动不会安装数据库。前置只需会打开终端、切换目录和编辑文本;在仓库根目录执行本课程命令,SQL则在mysql提示符后执行,不把两种命令混输。
教学固定MySQL 8.4.7 LTS、CPython 3.12.14、官方Connector/Python 9.5.0;这是可复现组合,不表示最新版本。核对日期2026-10-17。MySQL镜像为Linux/amd64;Windows通过Docker Desktop运行Linux服务,不能据此声称验证了Windows原生MySQL安装。项目客户端在Windows与Linux均实际运行;macOS不纳入。
需要Docker引擎已启动、端口23306空闲。以下PowerShell/Bash均可按单行执行,名称和密码只用于本地独立实验;已有同名容器时先检查,不覆盖用户数据库。
docker version
docker pull mysql:8.4.7
docker run -d --name showdocs-m4-mysql-server -p 127.0.0.1:23306:3306 -e MYSQL_ROOT_PASSWORD=m4-local-root -e MYSQL_DATABASE=inventory_lab -e MYSQL_USER=lab -e MYSQL_PASSWORD=m4-local-lab -v showdocs-m4-mysql-data:/var/lib/mysql mysql:8.4.7
docker exec showdocs-m4-mysql-server mysqladmin ping -uroot -pm4-local-root
docker exec -it showdocs-m4-mysql-server mysql --default-character-set=utf8mb4 -ulab -p inventory_lab首次初始化可能尚未完成,mysqladmin失败时检查docker logs,等待就绪后重试;不要因此重建数据卷。首次SQL预期VERSION为8.4.7、DATABASE为inventory_lab、CURRENT_USER对应lab账号(Host按账号匹配决定)。
最后一步交互输入实验密码m4-local-lab;命令行-p后不接密码可避免出现在Shell历史。ping只证明服务接受连接,仍需验证实际账号和数据库。Docker环境变量只在空数据目录首次初始化时生效,修改-e不会重设已有volume密码。容器内mysql默认连Unix socket;宿主机驱动连127.0.0.1:23306,两个端口分别是容器3306与映射23306。
常用命令与安全读写
下面每句以分号结束;\q退出客户端,\c取消当前未完成输入。SQL关键字大小写不影响含义;表名大小写可能随系统配置变化,本课程统一小写。
SELECT VERSION(), DATABASE(), CURRENT_USER();
SHOW DATABASES;
SHOW TABLES;
SELECT @@character_set_connection, @@transaction_isolation, @@autocommit;首次表列表为空是正常结果。先运行完整项目初始化,再在同一库试读写:
SHOW CREATE TABLE products;
SELECT sku, name, stock FROM products ORDER BY sku LIMIT 20;
START TRANSACTION;
UPDATE products SET stock=stock+1 WHERE sku='book';
SELECT ROW_COUNT();
ROLLBACK;WHERE决定受影响行,UPDATE没有WHERE会更新全表。操作前用同一WHERE做SELECT预览并核对目标库。ROW_COUNT为上一语句影响行数;不要先执行其他语句再读取。ROLLBACK后库存不变;CREATE TABLE等DDL可能隐式提交,不能靠把DDL包进事务获得撤销功能。DROP/DELETE不是本课程初始化的通用清理办法。
NULL、字符集与比较
NULL表示未知或未提供,空字符串表示已知的零长度字符串,二者不同。note=NULL的结果是UNKNOWN,WHERE只保留TRUE,因此用IS NULL。聚合COUNT(*)统计行,COUNT(note)只统计非NULL值。
SELECT sku,note,COALESCE(note,'未填写') AS display_note FROM products;
SELECT COUNT(*) AS total,COUNT(note) AS filled FROM products;
SELECT sku FROM products WHERE note IS NULL;项目两个商品note都是NULL,因此total=2、filled=0。采用utf8mb4保存中文及四字节emoji,连接字符集也须相同,只有表定义正确仍可能在传输时损坏。sku与request_id使用utf8mb4_bin,使请求标识大小写区分;展示名的排序、大小写、重音规则需要按业务选择collation,不能把排序规则当作编码。
账号、连接与下一步
应用使用仅获inventory_lab权限的lab账号,不使用root。真实远程服务需限制网络与账号来源、通过密钥管理提供密码并核验TLS证书;本机隔离实验没有验收公网TLS部署。Access denied要同时核对账号、密码、来源Host和目标库,Can't connect则先核对进程、端口和网络。不要把修改认证插件当所有连接失败的通用解。
研究依据:MySQL 8.4手册、驱动兼容矩阵。国内资料采用华为云MySQL最佳实践对照运维任务;云厂商特定内核功能不推定为社区版能力。
继续阅读
- 知识专题
- 应用实践
- 知识专题