如何强制mysql LIKE区分大小写?

105

1
我不会投反对票或关闭投票,因为我实际上找不到任何值得这些投票的东西。然而,我同意Andy的看法,答案可以通过一点网络搜索更快地找到。我会称之为“懒惰”,但61300声望并不表示懒惰。也许是overflow-holic。 - James Webster
@JamesWebster 好了,该坦白了。我正在尝试获得“回答自己的问题”帽子。很无聊,是的,我是个 Stack Overflow 狂热者。如果它在几分钟内没有得到投票,我就会关闭它 :) 即便如此,我认为这个问题还是有价值的。 - Bohemian
1
@AndyRay 五年后,使用谷歌搜索首先呈现的是这个答案 :) - Kip
2
嗯,这不是链接问题的重复。链接问题的标题很糟糕,但它是有人试图让大小写不敏感并由于CONCAT_WS的行为而遇到麻烦。 - Paul Wheeler
https://dev59.com/PnE85IYBdhLWcg3wOw_s#73325848 - Billu
2个回答

209

使用 LIKE BINARY

mysql> SELECT 'abc' LIKE 'ABC';
    -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
    -> 0

@Weltkind 为什么这样更好?(我并不表示同意或不同意,只是想知道你为何这样说) - Kip
3
在我看来,这样做更好,因为它不预设任何字符集,可以与任何排序方式一起使用。它只是进行一个直接的“精确匹配”,每个人都能理解。并且它更容易记忆(只需记住一个关键字:“BINARY”),编码也更简单(你不必记住像“utf8_bin”这样的有效字符集名称)。 - Bohemian
有点偏题,但如果你正在学习SQL注入(特别是盲注攻击),那么我想这是执行区分大小写比较的唯一方法;像COLLATE这样的东西会因为存在双引号而搞乱查询。 - Mayank Sharma
1
@Bohemian 不幸的是,代码可能会更简单,但是当您拥有重音符号并且列字符集与当前会话字符集不同时(通常是服务器默认设置),它将是不正确的。例如,如果您有一个字符集为latin1的列,而默认的服务器字符集为utf8mb4,则select * from Table where Col like binary 'über'将无法匹配Table中具有值为'über'Col行,因为在Latin1编码下ü的十六进制表示为0xFC,而在utf8mb4编码下为0xC3Bc。如果您想确保正确性,您需要使用二进制排序规则进行字符串比较。 - Paul Wheeler

39

另一种选择是使用 COLLATE

SELECT *
FROM table1
WHERE columnName like 'a%' COLLATE utf8_bin;

1
不错。这为使用自定义排序规则进行自定义匹配提供了机会(尽管完全不可移植,但如果需要,就需要它)。 - Bohemian
2
不起作用。结果不区分大小写。 - Nick
@Nick,这对我有效。WHERE Prompt LIKE '%ElasticSearch%' COLLATE utf8_bin 返回的是 ElasticSearch 而不是 Elasticsearch(大小写字母 S 的区别)。 - Kip
2
这段代码在默认字符集不是utf8的服务器上会出现问题。此外,utf8mb4现在是首选字符集。我建议将代码更改为:like convert('a%' using utf8mb4) collate utf8mb4_bin,这样无论服务器的默认字符集还是当前会话的字符集如何,都可以正常工作。或者,您可以显式设置会话的字符集。 - Paul Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接