
mysql版本:mariadb 10.1.16,采用utf8-ci,不区分大小写的排序规则。
开发人员反应业务要求要区分大小写,就是说当输入小写条件时,只能返回小写条件对应的数据,不能返回大写。
dba@192.168.19.215:3306mdls01:58:57>SELECT
->cabinet_no
->FROM
->go_task_ycon_refrence gtyr
->WHERE
->1 = 1
->AND cabinet_no = 'abcd4499503'
->ORDER BY
->1 ASC
+-------------+
| cabinet_no |
+-------------+
| ABCD4499503 |
+-------------+
1 row in set (0.00 sec)
2.问题解决
在条件字段后面加COLLATE utf8_bin ,或在表级或字段级指定COLLATE utf8_bin
dba@192.168.19.215:3306mdls02:08:08>SELECT
->cabinet_no
->FROM
->gtyr
->WHERE
->1 = 1
->AND cabinet_no COLLATE utf8_bin = 'ABCDU4499503'
->ORDER BY
->1 ASC
+-------------+
| cabinet_no |
+-------------+
| ABCD4499503 |
+-------------+
1 row in set (0.00 sec)
dba@192.168.19.215:3306mdls02:08:43>SELECT
->cabinet_no
->FROM
->gtyr
->WHERE
->1 = 1
->AND cabinet_no COLLATE utf8_bin = 'abcd4499503'
->ORDER BY
->1 ASC
Empty set (0.00 sec)
通常我们会遇到一个字段中存储多个相似单词,比如这样:
我们通过like进行查询时 like ‘%teacher%’,但是大写的Teacher也会被我们找到;
原因:由于sql在查询时默认不会进行大小写区分;
这时我们可以使用BINARY类型转换运算符;
BINARY 运算符将紧随其后的 string 转换为 二进制字符串。
主要用来强制进行按字节进行比较(byte by byte),字节而不是字符的字符。
这使得字符串比较 是区分大小写 的, 不管原始的列定义是否是 BINARY 或者 BLOB。
BINARY 也 对字符串末尾的空格敏感 。
sql可以这样写:select * from 表 where name like binary '%teacher%'
select * from abc whre id="a" 与select * from abc whre id="A" 查询出的结果是不同的
对单个字段设置的方式就不用说了,希望得到是对mysql默认的设置或是对整个库的设置
是否区分大小写和校对规则有关,默认设的规则是大小写不敏感的。
show create table如果看到collate是ci结尾,那么就是不区别的,如果cs或bin结尾,就是区别的。
如果建表的时候选择的是区别大小写的规则而查询的时候又暂时不想区别,
可以用类似
WHERE column_name COLLATE latin1_general_ci = 'xxx'
的写法改变查询使用的校对规则
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)