navicat 导出的 sql 文件含条件注释(如/!40101 set.../),mysql 命令行执行时报错,因旧版客户端误解析;应加--force参数导入,或开头插入set names utf8mb4并指定--default-character-set=utf8mb4。
navicat 导出的 sql 文件里有 /*!40101 set @old_character_set_client=@@character_set_client */ 这类注释,mysql 命令行直接执行报错
这类注释是 mysql 的条件注释(conditional comment),navicat 默认启用“兼容 mysql 4.0+”导出选项,会插入大量 /*!...*/ 形式语句。命令行用 mysql 客户端执行时,若未加 --force 或未启用 --comments,部分版本(尤其是较老的 mysql 客户端或 mariadb)会把它们当普通注释跳过,但某些语句(如 set 行)可能因语法位置异常被误解析,导致 error 1064 (42000)。
实操建议:
- 优先用原生
mysql客户端加--force参数导入:mysql -u root -p --force ,它会跳过单条错误继续执行 - 若需干净执行,用
sed或grep预处理(Linux/macOS):grep -v '^/\*!.*\*/$' backup.sql | mysql -u root -p;注意别误删带业务逻辑的/*!50003 ... */存储过程注释 - Navicat 下次导出时,在「高级」选项中关闭「导出 MySQL 特定语句」或勾选「导出为标准 SQL」,可大幅减少这类注释
DataGrip 导出的 CREATE TABLE 语句含 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,在 MySQL 5.7 或 MariaDB 上报错
这是字符集与排序规则不兼容的典型表现。utf8mb4_0900_ai_ci 是 MySQL 8.0.1 引入的默认 collation,5.7 只认 utf8mb4_general_ci 或 utf8mb4_unicode_ci;MariaDB 则用 utf8mb4_unicode_ci 或自定义的 utf8mb4_strict_ci。
实操建议:
- 导入前用文本编辑器全局替换:
utf8mb4_0900_ai_ci→utf8mb4_unicode_ci(MySQL 5.7 安全),或utf8mb4_general_ci(兼容性最广,但排序精度略低) - 检查
sql_mode:DataGrip 有时导出含STRICT_TRANS_TABLES的 SET 语句,老版本 MySQL 不支持,删掉整行SET sql_mode = 'STRICT_TRANS_TABLES,...'更稳妥 - 如果表结构里有
JSON字段,确认目标库版本 ≥ 5.7.8(MySQL)或 ≥ 10.2.7(MariaDB),否则要手动改成TEXT并加校验逻辑
导入时报 ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
这通常是因为备份文件里含 SET GLOBAL、CREATE DEFINER= 视图/函数,或 EVENT 相关语句——Navicat 和 DataGrip 默认保留 DEFINER 信息,而普通账号没 SUPER 权限。
实操建议:
- 用
sed删除 DEFINER 行(Linux/macOS):sed '/DEFINER=/s/DEFINER=[^ ]* / /' backup.sql > clean.sql,再导入clean.sql - 临时提升权限不是好办法;更安全的是用
mysqldump --skip-definer重导一次,或让 DBA 执行SET GLOBAL log_bin_trust_function_creators = 1(仅限可信环境) - 如果必须保留 DEFINER,导入账号需显式授权:
GRANT SUPER ON *.* TO 'user'@'host'; FLUSH PRIVILEGES;,但生产库应避免
导入后中文乱码,但数据库和表字符集都设成了 utf8mb4
根本原因常不在表结构,而在连接层:备份文件头部缺失 SET NAMES utf8mb4,或客户端连接时未指定字符集,导致 MySQL 把读入的字节流按 latin1 解析。
实操建议:
- 在 SQL 文件最开头手动插入一行:
SET NAMES utf8mb4;(放在所有CREATE之前) - 导入命令显式指定字符集:
mysql -u root -p --default-character-set=utf8mb4 ,比在文件里加 <code>SET更可靠 - 检查 Navicat/DataGrip 导出设置里的「字符集」选项,确保选的是
UTF-8而非System Default——后者在 Windows 上可能是GBK,导出文件本身已损坏
字符集问题最容易被当成“数据丢了”,其实只是解码错位;真正难调的是 DEFINER 权限和条件注释嵌套层级,这两处一错,导入就卡在第一张表。











