场景:
最近在做查询的时候,无意中发现与预期的结果不一样,通过使用‘广汽菲克jeep’作为查询条件查询数据,可以查到‘广汽菲克Jeep’。如下:
查了一下才知道是mysql的排序规则导致的。看一下测试环境数据库的设置:
show variables;
可以看到采用的字符集是utf8mb4,排序规则是utf8mb4_general_ci。
查了一下官方的文档,表示一个字符集至少可以有一个排序规则,可以通过 SHOW COLLATION 查看字符集以及对应的排序规则,utf8mb4对应的排序规则是utf8mb4_general_ci,所以我的环境的排序规则是utf8mb4_general_ci
在文档中找了一下排序规则后缀的描述,以_ci为后缀的为大小写不敏感的,所以会出现上面的情况:
往下翻了翻文档,计划该这个表的排序规则,或者字段的排序规则:
改表(改的时候生效了但是还是大小写不敏感,不知道为什么,有知道的求指点):
ALTER TABLE t_third_car_mapping CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';
改字段(生效):
ALTER TABLE t_third_car_mapping MODIFY third_factory_name VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
看一下结果:
但是最终生产的数据库不允许改表的排序规则,所以选择了通过sql的关键字binary来进行处理 :
select *
from t_third_car_mapping where third_factory_name = binary ('广汽菲克jeep');