本地导入一份 sql 文件,mysql 命令行直接报 ERROR 1049 (42000): Unknown database 'shop',原因是库还没建。mysql创建数据库本身一条语句的事,字符集选错后面全是麻烦。

一条 CREATE DATABASE

登录后执行:

CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

MySQL 8.0 默认排序规则是 utf8mb4_0900_ai_ci,5.7 常用 utf8mb4_general_ci,两者差别在排序和比较的细节,新项目跟着版本默认走就行。加 IF NOT EXISTS 可以避免重复执行时报错。

字符集为什么不用 utf8

MySQL 里的 utf8 实际是 utf8mb3,最多三个字节,存 emoji 和部分生僻字会报 Incorrect string value。utf8mb4 是完整的四字节实现,新库一律选它。老项目不想改,至少把连接、表、字段三层字符集对齐,不然中文乱码能查一下午。

建完顺手确认三件事

用 SHOW CREATE DATABASE shop 看字符集是否生效;用 USE shop 切过去再建表;确认账号权限,GRANT ALL PRIVILEGES ON shop.* TO 'app'@'%' 之后执行 FLUSH PRIVILEGES。生产环境别图省事给 root 开远程登录。

表名大小写这个坑

Linux 上的 MySQL 默认区分表名大小写,Windows 不区分,本地跑得好好的项目上服务器就报 Table doesn't exist。要么统一小写下划线命名,要么在建库前确认 lower_case_table_names 的设置,这个参数建库后再改很麻烦。

建库语句最好写进项目的初始化脚本,换机器或者重装环境时直接执行,别靠记忆手敲。

mysql创建数据库的完整动作:选 utf8mb4、定排序规则、设好权限、统一命名。库建对了,后面导入和迁移能少踩一半坑。