MySQL的Illegal mix of collations异常解决办法

异常出现原因:

sql语句中,不同字符集或者不同排序规则的两个字段做交互操作的时候可能会出现这种异常情况

解决办法:

  1. 彻底解决:修改数据库,把两个字段的字符集和排序规则进行统一;
  2. 更改排序规则:可以使用 collate 关键字指定字段排序规则,从而统一好两个表的排序规则再进行查询;
 SELECT * FROM
	tradelog l,
	trade_detail d 
WHERE
	l.tradeid collate utf8mb4_general_ci = d.tradeid
  1. 更改字符集:CONVERT(expr USING transcoding_name)
 SELECT * FROM
	tradelog l,
	trade_detail d 
WHERE
	CONVERT(l.tradeid USING utf8) = CONVERT(d.tradeid USING utf8)

备注

  1. 有时候联表查询操作,但是索引没有起效的原因。有可能是因为联表的两个字段的字符集不一致的问题;
  2. 但是为什么字符集不一致就会导致索引失效呢?归根到底是因为联表操作时,由于字段字符集不一致并且对索引字段进行了隐式字符编码转换。(此处如果能不对索引字段进行隐式字符编码转换。那么也是能走索引的,所以我们在用CONVERT函数更改字符集时优先更改非索引字段)
  3. 大家都经常说对索引字段做函数操作会使得索引失效,那么CONVERT()函数也不例外,也会使得索引失效。
  4. 那为什么对索引字段做函数操作会使得索引失效呢?因为对索引字段做函数操作,可能会破坏索引值的有序性,索引就是一个排好序的数据结构。如果对索引字段进行函数操作,比如使用month() 函数操作索引字段,那么就会把’2018-7-1’和’2020-5-1’这两个值的顺序破坏了!
  5. 即时某些函数操作不会破坏索引值的有序性,但是mysql也做了规定,一旦使用了函数操作索引字段,那么索引就会失效。即使是field+ 1 =10 这样的操作也会使得索引失效。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值