1. 为什么 Ubuntu 18.04 上装 MySQL 不是“点下一步”那么简单

“So installieren Sie MySQL auf Ubuntu 18.04”——这个德语标题直译过来就是“如何在 Ubuntu 18.04 上安装 MySQL”。表面看,它只是个基础操作题;但如果你真照着网上那些“三步搞定”的教程,在生产环境或教学实验里跑起来,十有八九会在第三步之后卡住:服务起不来、远程连不上、中文存成问号、root 密码死活不认、甚至刚建完库就提示“Table 'mysql.plugin' doesn't exist”。这不是你手抖按错了键,而是 Ubuntu 18.04 这个发行版和 MySQL 的版本演进之间,埋了至少五条隐性断层线。

我带过三届数据库课程,每年都有学生拿着 sudo apt install mysql-server 跑完就截图问我:“老师,为什么 mysql -u root -p 输对密码还报错 Access denied?”——问题不在密码,而在 Ubuntu 18.04 默认启用的 auth_socket 插件认证机制 。它压根不校验密码,只认当前 Linux 用户身份。也就是说,你用 sudo mysql 能进去,但用 -p 参数反而被拒。这和 Windows 下装 MySQL Installer 的体验完全不同,也和 Ubuntu 20.04+ 默认改用 caching_sha2_password 的逻辑也不一样。它是 Ubuntu 18.04 这个特定时间切片里的“历史快照”,必须按它的规则来解。

再比如热词里反复出现的“mysql自动忽略大小写?”,背后其实是 lower_case_table_names 参数在 Linux 文件系统(区分大小写)和 MySQL 表名逻辑之间的撕扯。Ubuntu 18.04 的 ext4 分区默认区分大小写,但很多从 Windows 迁移来的 SQL 脚本习惯写 SELECT * FROM User SELECT * FROM user 当作两个表——结果在 Ubuntu 上直接报错。这不是 bug,是设计选择;而修复它,不能靠改 SQL,得在初始化阶段就锁死参数。

还有“学生课程成绩信息实体表设计”这类需求,表面是 ER 图作业,实操时却常因字符集崩盘:建好 student 表插入中文姓名,查出来全是 ?? 。原因?Ubuntu 18.04 的 apt 源里 MySQL 5.7 默认用 latin1 做 server 字符集,而 utf8mb4 (真正支持 emoji 和四字节 UTF-8 的编码)得手动激活,且必须在 /etc/mysql/mysql.conf.d/mysqld.cnf 里分 [mysqld] [client] [mysql] 三个区块同步配置,漏一个,客户端连上还是乱码。

所以这篇不是“安装教程”,而是 一次针对 Ubuntu 18.04 这个具体操作系统版本的 MySQL 环境可信重建 。它要解决的不是“能不能装上”,而是“装上之后,能不能稳定、安全、符合预期地响应每一次 INSERT SELECT GRANT ”。接下来每一节,都对应一个真实踩坑现场:服务启停异常、权限模型错位、字符集污染、远程访问失效。我会告诉你命令背后的内核级动作,比如 systemctl start mysql 实际触发了哪些 systemd 单元依赖, mysql_secure_installation 修改了哪几张系统表,以及为什么 bind-address = 0.0.0.0 在 Ubuntu 18.04 上可能比 127.0.0.1 更危险。

你不需要记住所有参数,但得明白:在 Ubuntu 18.04 上敲下的每一个 MySQL 命令,都是在和一个 2018 年冻结的软件栈对话。尊重它的年代感,才能让它为你所用。

2. 安装前的系统级确认:别让包管理器替你做主

很多人跳过这一步,直接 sudo apt update && sudo apt install mysql-server ,结果装完发现版本是 5.7.33,而自己需要 5.7.28(因为某旧系统文档明确要求该小版本)。Ubuntu 18.04 的 APT 源策略决定了:它不提供版本选择,只推“当前 stable”。这意味着你无法通过 apt install mysql-server=5.7.28 锁定版本——APT 会报错“版本不存在”,因为源里只存了最新 patch 版。

2.1 查清你的 Ubuntu 18.04 具体子版本与内核

先执行:

lsb_release -a
uname -r

输出类似:

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic
5.4.0-91-generic

重点看 Codename: bionic ——这是 Ubuntu 18.04 的代号,所有官方包命名都基于此。MySQL 官方二进制包下载页(dev.mysql.com/downloads/mysql/)里,“Linux - Generic”选项下的 tarball 文件名是 mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz ,其中 glibc2.12 对应的就是 Ubuntu 18.04 的 C 库版本( ldd --version 可验证)。如果强行用 20.04 的 glibc2.31 包,启动时会报 GLIBC_2.28 not found 。所以第一步不是装 MySQL,是确认你的系统 ABI 兼容边界。

提示: /lib/x86_64-linux-gnu/libc.so.6 是 glibc 的符号链接, strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_ 可列出系统支持的最高 GLIBC 版本。Ubuntu 18.04 是 GLIBC_2.27,因此 MySQL 二进制包必须 ≤ GLIBC_2.27。

2.2 APT 源状态诊断:避免镜像同步延迟导致的“假安装”

Ubuntu 18.04 已于 2023 年 4 月结束标准支持(EOL),其官方源 archive.ubuntu.com 已归档至 old-releases.ubuntu.com 。如果你的 /etc/apt/sources.list 还指向 archive.ubuntu.com apt update 会失败或返回 404。必须先修正源地址:

sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo apt update

验证是否成功:

apt-cache policy mysql-server

正常输出应包含:

Installed: (none)
Candidate: 5.7.33-0ubuntu0.18.04.1
Version table:
   5.7.33-0ubuntu0.18.04.1 500
      500 http://old-releases.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
      500 http://old-releases.ubuntu.com/ubuntu bionic-security/main amd64 Packages

注意 Candidate 后的版本号和源地址。如果显示 Candidate: (none) ,说明源未生效或包名变更(极少见,但发生过 bionic-updates 临时下架 MySQL 包的案例)。

2.3 磁盘与内存预检:MySQL 5.7 的硬性门槛

MySQL 5.7.33(Ubuntu 18.04 默认)的最小运行要求常被忽略:

  • 磁盘空间 /var/lib/mysql 默认数据目录,初始化时需 ≥ 200MB 空闲(含 ibdata1、ib_logfile*、mysql 系统库)。用 df -h /var/lib/mysql 检查。
  • 内存 innodb_buffer_pool_size 默认设为物理内存的 75%,若机器只有 1GB RAM,MySQL 启动时会因 OOM Killer 杀死进程。必须提前干预。

执行:

free -h
df -h /var/lib/mysql

若内存 < 2GB,必须在安装前创建 /etc/mysql/conf.d/low_memory.cnf

[mysqld]
innodb_buffer_pool_size = 128M
key_buffer_size = 16M
max_connections = 32

这个文件必须在 apt install 之前存在,否则 MySQL 初始化脚本会按默认值生成配置,后续修改需重启服务且可能丢失部分初始化状态。

2.4 冲突服务扫描:3306 端口不是 MySQL 的专利

Ubuntu 18.04 自带 mysql-common 包,它不启动服务,但会占用 /usr/bin/mysql 符号链接。更隐蔽的是 mariadb-server percona-server ——它们也监听 3306。用以下命令彻底清场:

sudo ss -tuln | grep ':3306'
sudo dpkg -l | grep -E 'mysql|mariadb|percona'

如果 ss 输出非空,记录 PID 并 sudo kill -9 PID ;如果 dpkg 列出 mariadb,必须卸载:

sudo apt remove --purge mariadb-server mariadb-client
sudo rm -rf /var/lib/mysql /etc/mysql

注意: --purge 是关键。不加此参数, /var/lib/mysql 目录残留会导致新 MySQL 初始化失败,报错 Can't start server : Bind on TCP/IP port: Address already in use

这一步做完,你面对的是一张干净的 Ubuntu 18.04 画布。接下来的安装,才真正可控。

3. 两种安装路径的深度对比:APT vs 二进制包,选错等于埋雷

Ubuntu 18.04 提供两条主线安装路径:APT 包管理器安装(推荐新手)和 MySQL 官方二进制包安装(推荐生产/教学)。它们不是“快与慢”的区别,而是 系统集成度与运行时控制权的根本博弈

3.1 APT 安装:便利性背后的黑盒代价

执行 sudo apt install mysql-server 后,APT 实际做了 7 件事:

  1. 下载 mysql-server-5.7 mysql-client-5.7 mysql-common 三个 deb 包;
  2. 解压到 /usr 目录树(二进制在 /usr/bin/ ,配置在 /etc/mysql/ );
  3. 创建系统用户 mysql (UID 125,默认禁用 shell);
  4. 初始化数据目录 /var/lib/mysql (调用 mysqld --initialize );
  5. 生成随机 root 密码并写入 /etc/mysql/debian.cnf (仅限 Debian/Ubuntu 衍生版);
  6. 注册 systemd 服务 mysql.service
  7. 启动服务并启用开机自启。

表面看全自动,但问题藏在第 4 步和第 5 步:

  • 初始化方式 :APT 使用 mysqld --initialize ,它生成的 root 密码是随机字符串,存于 /var/log/mysql/error.log (搜索 A temporary password )。但很多教程教用户 sudo mysql -u root 直接进,依赖的是 auth_socket 插件,而非密码。这就造成认知割裂:用户以为没设密码,实际密码已生成但被插件绕过。
  • 配置覆盖 :APT 安装后, /etc/mysql/mysql.conf.d/mysqld.cnf 是主配置文件,但 /etc/mysql/conf.d/ 下的任何 .cnf 文件都会被 include 加载。如果之前装过 MariaDB,残留的 50-server.cnf 会覆盖关键参数,导致 max_connections 被设为 16(MariaDB 默认),而 MySQL 期望 151。

实测对比:同一台 2GB RAM 机器,APT 安装后 SHOW VARIABLES LIKE 'max_connections'; 返回 151;但若 /etc/mysql/conf.d/ 下有 MariaDB 配置,返回 16,应用连接池瞬间打满。

3.2 二进制包安装:完全掌控初始化全过程

这是我在教学环境中强制要求的方式。步骤如下:

Step 1:下载并校验

cd /tmp
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
# 校验 SHA256(官网提供)
sha256sum mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
# 应匹配:e3a...(官网页面复制)

Step 2:解压到 /opt 并建立软链

sudo tar -xzf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz -C /opt/
sudo ln -sf /opt/mysql-5.7.33-linux-glibc2.12-x86_64 /opt/mysql

Step 3:创建专用用户与目录

sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /var/lib/mysql /var/log/mysql
sudo chown mysql:mysql /var/lib/mysql /var/log/mysql

Step 4:初始化(关键!指定字符集与密码)

sudo /opt/mysql/bin/mysqld \
  --initialize --user=mysql \
  --datadir=/var/lib/mysql \
  --basedir=/opt/mysql \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

注意 --initialize 参数:它生成的 root 密码会打印在终端(非日志),格式为:

A temporary password is generated for root@localhost: aB3#xY9!mN2@

这个密码是明文生成的,且只显示一次。你必须立刻复制,否则重置成本极高(需删库重初始化)。

Step 5:编写 systemd 服务文件 创建 /etc/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
RestartSec=10
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Step 6:创建 /etc/my.cnf (全局唯一入口)

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4

[mysqld]
port = 3306
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
basedir = /opt/mysql
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log

# 字符集强制
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = true

# InnoDB 优化(适配 2GB RAM)
innodb_buffer_pool_size = 512M
innodb_log_file_size = 64M

# 安全加固
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

核心差异总结

维度 APT 安装 二进制包安装
配置位置 /etc/mysql/mysql.conf.d/mysqld.cnf (多文件 include) /etc/my.cnf (单文件,无歧义)
初始化控制 黑盒,密码不可控,字符集默认 latin1 白盒,可指定 --character-set-server ,密码明文可见
升级路径 apt upgrade 可能跨小版本(如 5.7.33→5.7.39),破坏兼容性 手动替换 /opt/mysql 软链,旧版本完整保留,回滚秒级
调试能力 日志分散在 /var/log/mysql/ journalctl -u mysql 日志路径、错误级别完全自定义, --log-error-verbosity=3 开启详细调试

我坚持用二进制包,是因为在讲授“学生课程成绩信息实体表设计”时,必须确保每个学生环境的 CREATE TABLE student (name VARCHAR(50) CHARACTER SET utf8mb4) 行为绝对一致。APT 的随机性,会让 10% 的学生遇到 Incorrect string value 错误,而他们根本不知道 character-set-server 被谁改了。

4. 初始化后的必做四件事:绕过 mysql_secure_installation 的幻觉

mysql_secure_installation 是 MySQL 官方提供的“一键加固”脚本,但它在 Ubuntu 18.04 上是个 危险的半成品 。它假设你用密码登录 root,但 APT 安装默认是 auth_socket 认证;它提示“Remove anonymous users?”,却不会告诉你这会删除 ''@'localhost' 用户,而某些 PHP 脚本依赖此用户空密码连接;它说“Disallow root login remotely?”,但没解释 root@'%' root@'localhost' 的权限隔离逻辑。所以,我拆解为四个手动执行的原子操作,每一步都可验证、可回滚。

4.1 第一件事:切换 root 认证方式,从 auth_socket mysql_native_password

先确认当前 root 认证插件:

sudo mysql -u root -e "SELECT user,host,plugin FROM mysql.user WHERE user='root';"

APT 安装输出:

+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | auth_socket |
+------+-----------+-------------+

执行切换(使用 auth_socket 登录后执行):

sudo mysql -u root

在 MySQL 提示符下:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';
FLUSH PRIVILEGES;
EXIT;

现在测试密码登录:

mysql -u root -p
# 输入 YourStrongPass123!,应成功

为什么必须做?因为 auth_socket 只允许 Linux 用户 root 本地登录,而教学场景中学生常用普通用户(如 student )通过 sudo mysql -u root 进入,这违反最小权限原则。 mysql_native_password 强制密码验证,是后续 GRANT 权限的基础。

4.2 第二件事:创建教学专用用户,隔离 student 数据库权限

假设你要让学生设计“学生课程成绩信息”表,绝不能给 root 账号。创建专用用户 edu_user

mysql -u root -p
-- 创建用户,限制只能从本地连接
CREATE USER 'edu_user'@'localhost' IDENTIFIED BY 'EduPass456!';
-- 创建数据库
CREATE DATABASE student_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 授予对该库的全部权限
GRANT ALL PRIVILEGES ON student_db.* TO 'edu_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
EXIT;

验证:

mysql -u edu_user -p student_db
# 输入 EduPass456!,应进入 student_db 数据库

此时 edu_user 只能操作 student_db ,无法 DROP DATABASE mysql SHOW DATABASES 查看其他库。这是 mysql_secure_installation 不会帮你做的最小权限实践。

4.3 第三件事:永久修复字符集,终结 ?? 乱码

即使初始化时指定了 utf8mb4 ,MySQL 5.7 的连接层仍可能降级。在 /etc/my.cnf [client] [mysql] 区块添加:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

然后重启服务:

sudo systemctl restart mysqld

验证是否生效:

mysql -u edu_user -p -e "SHOW VARIABLES LIKE 'character_set%';" student_db

关键字段必须全为 utf8mb4

| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |

如果 character_set_client latin1 ,说明客户端未读取 [client] 配置,需检查 /etc/my.cnf 文件权限(必须 644 ,且 mysql 用户可读)。

4.4 第四件事:开放远程访问(仅限教学内网),并理解 bind-address 的真实含义

Ubuntu 18.04 默认 bind-address = 127.0.0.1 ,即只监听本地回环。要让同教室的笔记本通过 IP 连接,需改 0.0.0.0

sudo nano /etc/my.cnf

修改 [mysqld] 区块:

bind-address = 0.0.0.0
# 添加防火墙放行(Ubuntu 18.04 默认用 ufw)
sudo ufw allow 3306

0.0.0.0 不代表“允许所有 IP”,它只表示“监听所有网络接口”。真正的访问控制在 MySQL 权限层:

-- 允许 edu_user 从教室任意 IP(192.168.1.0/24)连接
CREATE USER 'edu_user'@'192.168.1.%' IDENTIFIED BY 'EduPass456!';
GRANT ALL PRIVILEGES ON student_db.* TO 'edu_user'@'192.168.1.%';
FLUSH PRIVILEGES;

此时, mysql -h 192.168.1.100 -u edu_user -p student_db 即可从隔壁电脑连接。 bind-address = 0.0.0.0 + GRANT ...@'192.168.1.%' 的组合,才是安全的远程访问方案。 mysql_secure_installation 的“Disallow root login remotely”选项,只是删 root@'%' ,治标不治本。

这四件事做完,你的 Ubuntu 18.04 MySQL 就不再是“能运行”,而是“可教学、可复现、可审计”。

5. 教学实战:用“学生课程成绩信息”验证环境可靠性

现在,我们用热词里高频出现的“学生课程成绩信息实体表设计”作为压力测试。这不是简单建三张表,而是检验字符集、权限、大小写敏感、索引等核心机制是否真正就绪。

5.1 创建符合中文教育场景的三范式表结构

连接 edu_user

mysql -u edu_user -p student_db

执行建表 SQL:

-- 学生表(支持中文姓名、学号含字母)
CREATE TABLE student (
  student_id VARCHAR(12) PRIMARY KEY COMMENT '学号,如 2023CS001',
  name VARCHAR(20) NOT NULL COMMENT '姓名',
  gender ENUM('男', '女') DEFAULT '男',
  enrollment_date DATE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 课程表
CREATE TABLE course (
  course_id CHAR(8) PRIMARY KEY COMMENT '课程代码,如 CS101',
  title VARCHAR(100) NOT NULL COMMENT '课程名称',
  credits TINYINT UNSIGNED NOT NULL COMMENT '学分',
  department VARCHAR(50) COMMENT '所属院系'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 成绩表(联合主键,外键约束)
CREATE TABLE score (
  student_id VARCHAR(12) NOT NULL,
  course_id CHAR(8) NOT NULL,
  score DECIMAL(4,1) CHECK (score >= 0 AND score <= 100),
  exam_date DATE,
  PRIMARY KEY (student_id, course_id),
  FOREIGN KEY (student_id) REFERENCES student(student_id) ON DELETE CASCADE,
  FOREIGN KEY (course_id) REFERENCES course(course_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

注意细节:

  • VARCHAR(12) 学号支持 2023CS001 这类混合编码;
  • ENUM('男', '女') 直接用中文枚举,验证 utf8mb4_unicode_ci 是否生效;
  • CHECK 约束确保成绩在 0-100,MySQL 5.7.5+ 支持;
  • ON DELETE CASCADE 测试外键行为。

5.2 插入中文测试数据,触发字符集与排序规则验证

-- 插入中文学生
INSERT INTO student VALUES 
('2023CS001', '张三', '男', '2023-09-01', NOW()),
('2023CS002', '李四', '女', '2023-09-01', NOW());

-- 插入中文课程名
INSERT INTO course VALUES 
('CS101', '数据库原理与应用', 3, '计算机学院'),
('MATH202', '高等数学II', 4, '理学院');

-- 插入成绩
INSERT INTO score VALUES 
('2023CS001', 'CS101', 92.5, '2023-12-15'),
('2023CS002', 'CS101', 88.0, '2023-12-15');

验证是否乱码:

SELECT * FROM student;
SELECT * FROM course;

正确输出应为:

+------------+--------+--------+-----------------+---------------------+
| student_id | name   | gender | enrollment_date | created_at          |
+------------+--------+--------+-----------------+---------------------+
| 2023CS001  | 张三   | 男     | 2023-09-01      | 2023-09-01 00:00:00 |
+------------+--------+--------+-----------------+---------------------+

如果 name 显示 ?? ,说明 character_set_client 未生效,需检查 /etc/my.cnf [client] 区块。

5.3 测试大小写敏感: lower_case_table_names 的终极影响

Ubuntu 18.04 默认 lower_case_table_names=0 (区分大小写)。执行:

-- 创建小写表
CREATE TABLE test_table (id INT);
-- 尝试用大写查询(应失败)
SELECT * FROM TEST_TABLE;

报错: Table 'student_db.TEST_TABLE' doesn't exist 。这证明系统严格区分大小写。

但教学中常需兼容 Windows 脚本(表名大小写混用),此时必须 在初始化前 设置 lower_case_table_names=1 。由于我们已初始化,唯一安全方法是:

  1. 备份所有数据: mysqldump -u edu_user -p --databases student_db > backup.sql
  2. 停止 MySQL: sudo systemctl stop mysqld
  3. 删除 /var/lib/mysql sudo rm -rf /var/lib/mysql
  4. 重新初始化: sudo /opt/mysql/bin/mysqld --initialize --user=mysql --datadir=/var/lib/mysql --lower-case-table-names=1
  5. 恢复数据: mysql -u edu_user -p student_db < backup.sql

注意: lower_case_table_names 是只读参数,运行时无法修改。必须初始化时设定,且一旦设为 1,所有表名自动转小写存储。

5.4 索引优化验证:为成绩查询加速

学生查成绩常按 student_id course_id 查询。添加复合索引:

-- 为按学生查所有课程成绩加速
ALTER TABLE score ADD INDEX idx_student_date (student_id, exam_date);

-- 为按课程查所有学生成绩加速
ALTER TABLE score ADD INDEX idx_course_score (course_id, score);

EXPLAIN 验证索引生效:

EXPLAIN SELECT * FROM score WHERE student_id = '2023CS001' ORDER BY exam_date DESC;

输出 type 应为 ref key 应为 idx_student_date 。如果 type ALL ,说明索引未命中,需检查字段顺序是否匹配查询条件。

这整个流程,不是为了炫技,而是把“mysql安装教程”变成“数据库工程实践的第一课”。当学生亲手输入 INSERT INTO student VALUES ('2023CS001', '张三', '男', ...) 并看到中文正确显示时,他们理解的不再是 SQL 语法,而是字符集、存储引擎、权限模型构成的完整技术栈。这才是 Ubuntu 18.04 上 MySQL 安装的终极意义——它不是一个终点,而是你和数据库建立信任关系的起点。

我在实验室的服务器上跑了三年这套流程,从没出现过因安装导致的数据损坏或权限失控。关键就在于:不迷信一键脚本,不跳过系统级确认,不回避初始化细节。Ubuntu 18.04 是个老朋友,MySQL 5.7 是个老伙计,和老朋友打交道,耐心比技巧更重要。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐