mysql varchar字段大小写不敏感的坑

mysql varchar字段大小写不敏感的坑

最近踩到的一个坑,记录下解决方案。

 

一、问题描述

遇到个神奇的问题,在mysql中执行如下语句:

查出来的均是 name = ‘aa’ 的字段。第一次遇到,感觉相当莫名其妙。

二、问题解决

谷歌“mysql varchar 大小写敏感”,得出以下解决方案:

(1)修改排序规则

参考:https://blog.csdn.net/menghuanzhiming/article/details/78779522

在mysql中存在着各种排序规则:

  1. utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
  2. utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
  3. utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

默认情况下varchar的排序规则为utf8_genera_ci,即不区分大小写,所以莫名其妙就被坑了,改成utf8_bin即可。

(2)CHARACTER SET utf8 COLLATE utf8_bin

项目中使用了gorm,在定义表结构时,可以这样定义:

即建表时,指定name字段编码为utf8,排序规则为utf8_bin,起到了(1)中同样的效果。

(3)查询时指定大小写敏感

在查询语句中加入BINARY:

BINARY不是函数,是类型转换运算符,用来强制它后面的字符串为一个二进制字符串,可以简单理解为在字符串比较的时候区分大小写。

我个人不推荐这样搞,因为修改数据库字段排序规则是一劳永逸的。

三、总结

记录一下。

发布者

xie4ever

发表评论

电子邮件地址不会被公开。