通过navicat导入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
通过select version()查询MySQL的版本,发现版本为5.6.51,是大于4.01.01的版本的,理应支持
然后我就截取了一段包含注释的sql文件直接放navicat中去执行,发现注释是能跑通的,但是mysql语句报错了,呕吼破案,所以navicat是支持的,是sql语句中有问题
报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:
1.下一次如果sql还是导不进去,可以直接贴一段sql到连接查询里去执行看报错,然后再排,可以节约时间更快速的定位到问题
2. 替换完了最后全局搜一下关键字看有没有遗漏
2022/06/25