异常出现原因:
sql语句中,不同字符集或者不同排序规则的两个字段做交互操作的时候可能会出现这种异常情况
解决办法:
- 彻底解决:修改数据库,把两个字段的字符集和排序规则进行统一;
- 更改排序规则:可以使用 collate 关键字指定字段排序规则,从而统一好两个表的排序规则再进行查询;
SELECT * FROM
tradelog l,
trade_detail d
WHERE
l.tradeid collate utf8mb4_general_ci = d.tradeid
- 更改字符集:CONVERT(expr USING transcoding_name)
SELECT * FROM
tradelog l,
trade_detail d
WHERE
CONVERT(l.tradeid USING utf8) = CONVERT(d.tradeid USING utf8)
备注
- 有时候联表查询操作,但是索引没有起效的原因。有可能是因为联表的两个字段的字符集不一致的问题;
- 但是为什么字符集不一致就会导致索引失效呢?归根到底是因为联表操作时,由于字段字符集不一致并且对索引字段进行了隐式字符编码转换。(此处如果能不对索引字段进行隐式字符编码转换。那么也是能走索引的,所以我们在用CONVERT函数更改字符集时优先更改非索引字段)
- 大家都经常说对索引字段做函数操作会使得索引失效,那么CONVERT()函数也不例外,也会使得索引失效。
- 那为什么对索引字段做函数操作会使得索引失效呢?因为对索引字段做函数操作,可能会破坏索引值的有序性,索引就是一个排好序的数据结构。如果对索引字段进行函数操作,比如使用month() 函数操作索引字段,那么就会把’2018-7-1’和’2020-5-1’这两个值的顺序破坏了!
- 即时某些函数操作不会破坏索引值的有序性,但是mysql也做了规定,一旦使用了函数操作索引字段,那么索引就会失效。即使是field+ 1 =10 这样的操作也会使得索引失效。