MySQL初始化脚本执行前须确认:1.mysqld进程已启动且监听3306端口;2.脚本不含CREATE USER/GRANT语句(除非用--init-file启动或手动登录);3.脚本首行不可写#!/usr/bin/env mysql。
脚本不是丢进命令行就能跑通的——多数失败源于权限、上下文或 MySQL 状态没对齐。
mysqld 进程必须已启动,且监听本地 3306(或你配置的端口),mysqladmin ping 能返回 mysqld is alive
CREATE USER 或 GRANT 语句,除非你已用 --init-file 启动或手动登录后执行;默认 root 密码为空时,直接 mysql -u root 才能连上#!/usr/bin/env mysql —— MySQL 不是解释器,这种 shebang 会被忽略,甚至导致语法错误这是最常用也最

ERROR 1045 (28000) 或乱码插入。
Incorrect string value
mysql -u root -p -h 127.0.0.1 -P 3306 --default-character-set=utf8mb4
USE db_name,建议每个语句后加 ; 并换行;MySQL 在管道中对空行和注释更敏感,--comments 参数不解决执行问题Docker 官方镜像(mysql:8.0)只认 /docker-entrypoint-initdb.d/ 下的 .sql、.sql.gz 或 .sh 文件,但行为有隐含规则。
.sh 脚本必须以 #!/bin/bash 开头,且最终调用 mysql -u root -e "...",不能直接 echo SQL 到 stdoutCREATE DATABASE 后立刻 USE,否则后续 CREATE TABLE 会报 No database selected
别急着重跑整个流程,先分层验证。
mysql -u root -e "SELECT VERSION();" 确认连接可用;若失败,问题在认证或网络,不是脚本本身mysql -u root 交互终端,观察哪一行报错(比如 DATETIME 字段在 5.6 里不支持 DEFAULT CURRENT_TIMESTAMP)tail -n 50 /var/log/mysql/error.log(Linux)或 docker logs ,里面常有比客户端更具体的提示,如 Unknown collation: 'utf8mb4_0900_as_cs'(说明用了 8.0 特有排序规则,但服务端是 5.7)SHOW VARIABLES LIKE 'character_set%';。