mysql大小写规则校验

原创
2017/06/08 14:15
阅读数 144

EXPLAIN SELECT a.* FROM gc_fin_rate_info  a LEFT JOIN rbac_user b ON a.owner =b.id;

处理之前的情况。

虽然走了索引,但是type不为ref。分析表的字符集及校验规则

 

两张表的字符集、引擎、核对规则都是一样的,就是不走索引

翻阅资料发现,mysql的字段也有校对规则,两个字符串比较,要求必须有相同的校对规则,或者是相容的,及左连的表的校对规则的级别高于主表,mysql的校对规则默认有utf8_bin(最高,以二进制的形式对编码进行比较),utf8_general_cs(区分大小写),utf8_general_ci(不区分大小写),如果left join左右两边的级别一样或者右边的级别高于左边的会走索引。

用show create table gc_fin_rate_info  ,rbac_user 查看关联的字段的属性,

CREATE TABLE `gc_fin_rate_info` (
`owner` CHAR(20) COLLATE utf8_bin NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

CREATE TABLE `rbac_user` (
`id` CHAR(20) CHARACTER SET utf8 NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

发现rbac_user的id没有校对规则,即级别小于主表的字段。所以不走索引

修改级别即可

ALTER TABLE rbac_user MODIFY id CHAR(20)  CHARACTER SET utf8  COLLATE utf8_bin NOT NULL;

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部