MYSQL因为排序规则不同导致的问题的解决办法

之前不知道为什么,项目的数据库中的表虽然都是utf8的字符编码,但排序规则有utf8_bin/utf8_unicode_ci/utf8_general_ci这3种,导致时不时会出现:

[Err] 1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='这种错误,意思是对于‘=’这种操作非法使用了混合的排序规则,即sql语句中‘=’左边和右边的列使用的排序规则是不一样的,因为涉及的表多,不可能一个一个改,网上有种用select语句生成脚本然后执行脚本的方法可以对多个表中普通的字段进行排序规则的修改,但当一个表的id是另一个表的外键时,就不能修改此Id列的排序规则了,脚本也就一样会报错不能使用了,手动去一个一个修改也是同样不行的,下面记录我的一种比较笨的解决办法,目前完美解决我的问题,如果有更好的办法,希望各大神在评论中讲一讲。我用的可视化工具是navicat,就以此为基础开始操作:

1.在当前数据上右键“导出数据和结构”,将数据库导出到.sql文件中;

2.使用文本编辑器(我的是notepad++)打开此文件,搜索‘utf8_bin’全部替换为'utf8_general_ci',搜索'utf8_unicode_ci'全部替换为‘utf8_general_ci’;

3.保存编辑;

4.删除原数据库;

5.新建一个同名数据库,设置编码为‘utf-8’,排序规则为‘utf8_general_ci’;

6.选择此数据库运行sql文件;

至此所有步骤完成,需要说明的是使用Hibernate自动建表时表的编码和排序规则会继承数据库的编码和排序规则,列的编码和排序规则又会继承表的编码和排序规则,故第5步中如果将排序规则设为‘utf8_general_ci’会导致运行的sql文件中如果有的表没有显示指定编码或排序规则就会使用数据库的编码或排序规则,以及以后新建的表会使用数据库的编码和 排序规则又会导致排序规则不一致的问题,故第5步和你在sql文件中替换的排序规则必须一致。

另外需要注意的是,如果存在存储过程和视图,导入时可能会报语法错误,这不是sql文件的问题,可能是navicat的问题或者MySQL的问题,解决办法为:

1.打开sql文件,将sql文件中创建存储过程和创建视图的语句剪切到一个txt文本文件中;

2.保存sql文件,此时sql文件中只有创建表和插入数据的sql语句;

3.选择数据库导入此sql文件,此时应该就能成功导入不会报错;

4.创建一个查询,将txt文件中的内容复制到查询中,执行查询,此时应该就可以成功创建视图以及存储过程并且不会报错了。

完。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值