必须先确认权限与连接状态,否则create database会报access denied或can't connect错误;服务未启动、端口被占或socket路径错误是连不上的主因;建库需显式指定utf8mb4字符集和utf8mb4_unicode_ci校对规则,并遵循snake_case命名规范。

直接创建数据库前,必须先确认你有权限且连接已就绪——否则 CREATE DATABASE 会报 Access denied 或 Can't connect to local MySQL server 错误。
mysql -u root -p 连不上怎么办
常见现象是命令行输入后卡住、报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket,本质是服务没起来或端口被占。
- Linux/macOS:运行
sudo systemctl status mysql看是否 active;若 inactive,用sudo systemctl start mysql启动 - Windows:检查「服务」里
MySQL80是否正在运行;若没有,用管理员权限运行net start MySQL80 - 端口冲突时(如 Docker 占了 3306),改配置或停掉占用进程:
sudo lsof -i :3306(macOS/Linux)或netstat -ano | findstr :3306(Windows)
CREATE DATABASE 语句必须加的两个关键参数
裸写 CREATE DATABASE myapp; 很容易在后续存中文时乱码、不支持 emoji,因为默认字符集可能是 latin1。
- 显式指定字符集和校对规则:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
utf8mb4是 MySQL 中真正支持 4 字节 UTF-8(含 emoji、生僻汉字)的编码;utf8在 MySQL 里只是伪 utf8,最多存 3 字节 - 如果不加
COLLATE,MySQL 会按 server 默认值补,但不同版本/安装方式默认值可能不同,显式写死更可靠
数据库名不能包含特殊字符或空格
虽然语法上允许用反引号包裹带横线或大写的库名,比如 `my-app`,但实际协作中极易出问题:
- ORM 框架(如 Django、Laravel)通常默认把数据库名当纯标识符处理,遇到
-会解析失败 - 备份脚本或自动化部署工具(如 Ansible、Shell 脚本)在拼接命令时,未转义的空格或横线会导致命令截断
- 推荐命名规则:
snake_case全小写,只用字母、数字、下划线,且不能以数字开头,例如bookstore_dev、user_service_db
创建后立刻 USE 并验证字符集
建完库不等于它就 ready for use,得进库看真实生效的配置:
- 执行
USE myapp;切换上下文 - 查当前库字符集:
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'myapp'; - 如果返回不是
utf8mb4和utf8mb4_unicode_ci,说明建库语句没生效,或者 MySQL 配置文件(/etc/mysql/mysql.conf.d/mysqld.cnf或my.ini)里强制覆盖了默认值
最容易被忽略的一点:MySQL 的 character-set-server 全局变量只影响新创建数据库的默认值,不影响已有库。所以哪怕你改了配置文件,也得重启 mysqld 才能让新库继承——但旧库仍需手动 ALTER DATABASE 修改。别指望“一劳永逸”地靠配置文件兜底。











