297 字
1 分钟
mysql查询设置大小写敏感以及性能(explain)对比
受到 此文 某些似懂非懂话语影响而折腾的笔记
解决方法:
查询时加上binary
explain 分析 sql语句 其中type有变动(sk已加上索引) type值解析


而不加binary 不区分大小写时

查询时强制二进制对比,尤其不好,这会让你代码中多出很多判断,且还有可能被绕过。至于直接使用二进制字段,mysql不会将它当成字符来处理,我觉得也可能存在问题。
字段建立时指定字符类型

-
使用
utf8_binselect * from api_key where sk = 'Gsxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'Select 语句可以区分大小写 执行效率:
explain select * from api_key where sk = 'GSxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'
-
使用
BINARY

`select * from api_key where sk = 'Gsxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'`Select 语句可以区分大小写执行效率:`explain select * from api_key where sk = 'GSxg583i+JhD4nHFCroeLKlMpUAI0XV9Rzjf6YqO_1Svy7QZkmw2PB'`
数据库创建时修改
laravel 数据库迁移解决方案
public function up(){ Schema::create('api_key', function (Blueprint $table) {
//一堆建表语句 }); //创建表成功后添加大小写敏感 DB::statement("alter table api_key modify column ak varchar(255) BINARY DEFAULT '' NOT NULL COMMENT 'as'"); DB::statement("alter table api_key modify column sk varchar(255) BINARY DEFAULT '' NOT NULL COMMENT 'as'");}最终得出
以上更改其实本质上也是把collatioin(校对)模式改成二进制校对,实现大小写敏感。
索引长度在判断大小写时会增加1,但是type会变成ref;
附给细心同学的懒人链接:key_len
参考资料: https://www.cnblogs.com/sonofelice/p/6432986.html http://cevin.net/archives/让mysql查询区分大小写.html https://blog.csdn.net/dennis211/article/details/78170079 https://www.cnblogs.com/yuyue2014/p/3700531.html https://www.cnblogs.com/clphp/p/5403215.html
mysql查询设置大小写敏感以及性能(explain)对比
https://www.motouguai.com/note/mysql-query-sets-case-sensitivity-and-performance-explain-comparison/ 部分信息可能已经过时