本地导入一份 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、定排序规则、设好权限、统一命名。库建对了,后面导入和迁移能少踩一半坑。