必须手动下载官方sakila SQL文件并按序导入:先sakila-schema.sql建结构,再sakila-data.sql插数据;MySQL 8.0+需将脚本中CHARSET=utf8替换为utf8mb4;导入时须在命令行指定数据库名,如mysql -u root -p sakila。

直接下载官方 sakila SQL 文件,别用包管理器装
MySQL 官方不提供通过 apt、brew 或 mysql-server 包自动安装 sakila 的方式。所谓“安装”,本质是执行 SQL 脚本建库建表——你得手动下载、解压、导入。常见错误是搜到过时教程,试图用 mysql-sakila 这类不存在的包名,结果报 Package 'mysql-sakila' has no installation candidate。
- 去官网唯一可信地址下载:https://www.php.cn/link/d7bfacae83b06f4a240de5c26222befb → 找 “Sample Databases” → 下载
sakila-db.zip - 解压后你会看到
sakila-schema.sql和sakila-data.sql两个文件,顺序不能错:先建结构,再插数据 - 如果用 MySQL 8.0+,注意默认字符集是
utf8mb4,而旧版脚本里部分CREATE TABLE语句硬写了utf8,会触发警告(不影响运行,但建议导入前用sed -i 's/CHARSET=utf8/CHARSET=utf8mb4/g'批量替换)
导入时必须显式指定数据库名,不能靠 USE 切换
很多人习惯先连上 MySQL,再执行 USE sakila;,然后 SOURCE sakila-schema.sql,结果报错 ERROR 1046 (3D000): No database selected。这是因为 SOURCE 命令本身不继承当前库上下文,脚本里又没写 CREATE DATABASE sakila;(它只建表),所以必须在命令行导入时就绑定库名。
- 正确做法:
mysql -u root -p sakila (注意 <code>sakila在命令末尾,是目标库名) - 接着再导入数据:
mysql -u root -p sakila - 如果提示
Access denied for user 'root'@'localhost',说明 root 密码不对或认证插件不是mysql_native_password;可临时改插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass';
Mac M1/M2 上用 Homebrew 装的 MySQL,路径和权限容易出问题
Homebrew 安装的 MySQL 默认不启用 socket 文件,且 mysql 客户端可能找不到本地服务。直接跑 mysql -u root -p sakila 很可能卡住或连不上。
- 先确认服务在跑:
brew services list | grep mysql,状态不是started就执行brew services start mysql - Homebrew MySQL 默认配置里没有
socket行,导入大文件(如sakila-data.sql约 3MB)时可能因超时失败;可在/opt/homebrew/etc/my.cnf(或~/homebrew/etc/my.cnf)里加:[client] socket = /opt/homebrew/var/mysql/mysql.sock
- 如果提示
Can't connect to local MySQL server through socket,就用mysql -u root -p -S /opt/homebrew/var/mysql/mysql.sock sakila 显式指定 socket 路径
导入后查不到表?检查默认 schema 和大小写敏感性
导入成功后执行 SHOW TABLES; 返回空,或者 SELECT * FROM film; 报 Table 'sakila.film' doesn't exist,大概率是大小写问题。Linux/macOS 默认开启 lower_case_table_names=0,而 sakila 脚本里建表语句用的是小写名,但你的 MySQL 配置可能设成了 1(强制小写存储)或 2(大小写不敏感但保留原样),导致表名映射错乱。
- 查当前设置:
mysql -u root -p -e "SELECT @@lower_case_table_names;" - 若返回
0,说明区分大小写,确保你连的是同一个实例(比如没误连到 Docker 容器里的 MySQL) - 若返回
1,且你确定脚本里全是小写表名(确实如此),那通常没问题;但如果你之前手动建过Sakila或SAKILA库,就可能冲突,删掉重来:DROP DATABASE IF EXISTS sakila; - 验证是否真有表:
mysql -u root -p -e "SELECT table_name FROM information_schema.tables WHERE table_schema = 'sakila';"
导入这事看着简单,但卡点全在环境细节里:官网链接藏得深、SQL 脚本和新版 MySQL 字符集不完全兼容、Homebrew 的 socket 路径不透明、大小写策略又依赖系统和配置。最常被跳过的其实是确认 mysql 客户端连的是你以为的那个实例——特别是本地同时跑着 Docker、MAMP、Homebrew 多个 MySQL 的时候。


















