.sql数据库导入错误:/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */

错误现象

通过navicat导入sql文件失败。

报错截图

报错原因排查

1. 首先排查了是不是由于sql文件中包含了大量注释导致的

     我开始以为是通过mysqldump命令导出数据库,所导出的sql中回包含许多的注释信息。导入的时候无法识别,后来去搜了注释的含义发现好像并不是。

1)注释的含义/*!后面的数字,其实就是mysql版本号信息,意思是当版本号高于或者等于注释里的版本号时,里面的set命令才会被执行。

例如:/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

1)40101,这是mysql版本号,该数字告诉我们这些语句只有在大于或等于该版本的mysql中才能执行,即在mysql4.01.01及以上版本的mysql中执行

2)set 语句是将当前系统变量CHARACTER_SET_CLIENT的值赋给OLD_CHARACTER_SET_CLIENT

2)导入数据时禁止/激活索引

说明:

         DISABLE KEYS 是禁止索引

         ENABLE KEYS 是激活索引

         在插入数据时,都会先禁止索引,再激活索引,这样可以节省导入数据的时间

LOCK TABLES `tb_shop_order` WRITE;
/*!40000 ALTER TABLE `tb_shop_order` DISABLE KEYS */;
INSERT INTO `tb_shop_order` VALUES (1,1,1,1,1.000000,1.000000,'1','1','1',1,'1','2020-02-20 00:00:00',1,'2020-02-20 00:00:00',1,'2020-02-20 00:00:00','1')
/*!40000 ALTER TABLE `tb_shop_order` ENABLE KEYS */

3)在备份文件末尾会出现如下注释语句,使用set的语句恢复服务器系统变量原来的值:

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

参考blog:

MySQL注释形式_可执行注释语句(/*!...*/)_数据库注释_数据库脚本注释_SQL脚本注释格式_SQL脚本注释分类_liaowenxiong的博客-CSDN博客_mysql 脚本注释文章目录为什么要把可执行的 SQL 语句写在注释里面呢?注释示例其它注释语句/*!...*/ 这叫可执行的注释(executable comments),注释当中的语句会被 MySQL 正常解析和执行,但在其他数据库管理系统将被作为注释忽略,这可以提高数据库脚本的可移植性。为什么要把可执行的 SQL 语句写在注释里面呢?MySQL 包含一些其它 DBMS 中不具备的功能扩展,如果使用了它们,将无法把代码移植到其它 DBMS 中。在某些情况下,你可以编写包含 MySQL 特殊扩展功能的代码,但仍保持其可https://blog.csdn.net/liaowenxiong/article/details/117223010  使用sed命令删除SQL文件中的注释信息当我们需要进行数据库迁移,而数据又是从低版本的mysql迁移到高版本的mysql使用,使用mysqldump命令导出数据库,所导出的SQL中会有许多的注释信息,如下: / !40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /; / !40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /; / !40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /; / !40101 SET NAMES utf8 /; / !40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /; / !40103 SET TIME_ZONE='+00:00' /; / !40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /; / !40014 SET @OLDhttps://copyfuture.com/blogs-details/20200325114105956muk0wbvlten06s4

2. 排查mysql版本

通过select version()查询MySQL的版本,发现版本为5.6.51,是大于4.01.01的版本的,理应支持

3. navicat是否支持mysqldump导出的sql文件

然后我就截取了一段包含注释的sql文件直接放navicat中去执行,发现注释是能跑通的,但是mysql语句报错了,呕吼破案,所以navicat是支持的,是sql语句中有问题

 4. mysql语句排查

报Unknown collation: 'utf8mb4_0900_ai_ci'的错于是我通过show charset查了一下当前支持的字符集和对应的排序规则,没有找到utf8mb4只找到了utf8字符集,应当是不支持utf8mb4字符类型

然后去查了 CHARSET=utf8mb4 和CHARSET=utf8mb4的区别:

utf8编码方式表示一个字符需要1-4个字节,但常用的字符只需1-3个字节就可以表示了;而在MySQL中表示一个字符所用的最大字节长度会影响系统的存储和性能,所以utf8指的其实是utf8mb3,即用1-3个字节编码的编码方式;

如果数据中有一些特殊字符(如emoji表情)那么请使用utf8mb4。
 

解决问题

把字符集和排序规则中的字符集替换成utf8排序规则替换成utf8_general_ci

 参考blog:

MySQL数据库导入SQL报错 Unknown collation: ‘utf8mb4_0900_ai_ci‘的解决办法_小刘要努力(ง •̀_•́)ง的博客-CSDN博客_mysql utf8mb4_0900_ai_ciMySQL数据库导入SQL报错 Unknown collation: ‘utf8mb4_0900_ai_ci‘错误原因:我本地的MySQL数据包版本为8.0的,而服务器上的MySQL版本为5.7,双方的版本不兼容,这样就导致我在本地写好的SQL无法在服务器上的MySQL上运行。解决办法:方案一:将服务器上的MySQL版本升级到高的版本方案二:将需要导入的SQL文件中的字符集由utf8mb4替换为utf8,排序规则由utf8...https://blog.csdn.net/weixin_44684272/article/details/119821853

经验总结

1.下一次如果sql还是导不进去,可以直接贴一段sql到连接查询里去执行看报错,然后再排,可以节约时间更快速的定位到问题

2. 替换完了最后全局搜一下关键字看有没有遗漏

2022/06/25

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值