Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation ‘<>’@TOC
项目场景:
Windows环境下利用python脚本连接远程mysql数据库,用source命令插入数据
问题描述:
windows环境下利用python的Popen函数,连接远程数据库,用source执行特定的sql完成数据的插入,但是当执行到source环节时,程序抛出了一个错误: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation ‘<>’
select * from a where tid>=100001 and tid<200001 and CaseFrom='招商网';
原因分析:
我翻译了一下大概明白了什么意思,大概意思是条件,就是因为编码的原因,我理解为两个条件所用的编码需要统一,从翻译来看因为UTF8编码无法隐式的转换,因为我的条件中有汉字,我生成的sql文件为UTF-8格式的,所以source 时windows默认的编码为GBK的导致,或者因为条件的内容为汉字导致的,接下来我需要统一编码
解决方案:
1. 更改生成的sql文件格式,此问题能解决
弊端: 因为UTF8的字符集比GBK要大不是所有的条件都包含在GBK,所以不推荐用这种办法
2. 更改连接数据库时的编码为utf8,此问题能解决,推荐用这种方式
mysql -h{host} -P{port} -u{user} -p{passowrd} --default-character-set=utf8
3. 利用convert更改汉字条件的编码,此问题的报错能解决,但是条件失去了作用,不能解决功能性问题,不推荐使用
select * from a where tid>=100001 and tid<200001 and CaseFrom=convert(‘招商网’ using utf8)
总结:
推荐使用第二种方式,简单方便