【问题标题】:How do you force mysql LIKE to be case sensitive? [duplicate]你如何强制 mysql LIKE 区分大小写? [复制]
【发布时间】:2012-12-10 01:20:03
【问题描述】:

可能重复:
Mysql Like Case Sensitive

Mysql 忽略大小写进行 LIKE 比较。

如何强制它执行区分大小写的 LIKE 比较?

【问题讨论】:

  • 我不会投反对票或近距离投票,因为我实际上找不到任何值得这些投票的东西。然而,我同意安迪的观点,只要稍微搜索一下,就能更快地找到答案。我称之为“懒惰”,但 61.3k rep 并没有说懒惰。也许是溢出狂
  • @JamesWebster 好的,时间到了。我正在努力获得“回答你自己的问题”的帽子。蹩脚的,是的,太狂热了。如果它在几分钟内没有投票,我会关闭它:) 即便如此,我认为这个问题有道理
  • @AndyRay 五年后,使用谷歌首先提出了这个答案:)
  • 嗯,这不是链接问题的重复。链接的问题的标题很糟糕,但有人试图获得喜欢 不区分大小写 并且由于CONCAT_WS 的行为而遇到麻烦。

标签: mysql sql case-sensitive sql-like


【解决方案1】:

使用LIKE BINARY:

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

【讨论】:

  • @Weltkind 为什么更好? (不是说我同意或不同意,只是好奇你为什么这么说)
  • @Kip 恕我直言更好,因为它不预设任何字符集并且适用于任何排序规则。它只是做了一个每个人都理解的简单的“精确匹配”。它也更容易记住(只需记住一个关键字:BINARY)和更简单的代码(您不必记住像 utf8_bin 这样的有效字符集名称)
  • 有点跑题了,但是如果您正在学习 SQL 注入(特别是基于盲注的攻击),那么我想这是执行区分大小写比较的唯一方法;由于双引号的存在,诸如 COLLATE 之类的东西会弄乱查询。
  • @Bohemian 不幸的是,代码可能更简单,但是当您有重音并且列字符集不同于当前会话字符集(通常是服务器默认值)时,它会不正确。例如,如果您有一个字符集为latin1 的列,并且您的默认服务器字符集为utf8mb4,那么select * from Table where Col like binary 'über' 将无法匹配TableCol 值为'über' 的行,因为ü 在 latin1 中是 0xFC,而在 utf8mb4 中是 0xC3Bc。如果您想获得正确性,则需要使用字符串比较和二进制排序规则。
【解决方案2】:

另一种选择是使用COLLATE

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

【讨论】:

  • 不错。这为使用自定义排序规则进行自定义匹配提供了机会(虽然完全不可移植,但如果你需要它,你需要它
  • 不起作用。结果不区分大小写
  • @Nick 它对我有用。 WHERE Prompt LIKE '%ElasticSearch%' COLLATE utf8_bin 正在返回 ElasticSearch 但不是 ElasticsearchS 的大小写不同)。
  • 这将在默认字符集不是 utf8 的服务器上被破坏。 utf8mb4 现在也是首选字符集。我建议将代码更改为:like convert('a%' using utf8mb4) collate utf8mb4_bin 无论服务器的默认字符集或会话的当前字符集如何,这都将起作用。或者,您可以显式设置会话的字符集。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 2011-09-09
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2013-07-07
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多