像MySQL中的Case敏感

Pmc*_*ery 33 mysql case-sensitive sql-like

我有一个MySQL查询:

SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';
Run Code Online (Sandbox Code Playgroud)

我的表格使用MyISAM编码为utf8_general_ci.

搜索似乎区分大小写.

我无法弄清楚如何解决它.出了什么问题和/或我该如何解决?

kol*_*pto 42

在性能方面更好的解决方案:

SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';
Run Code Online (Sandbox Code Playgroud)

当任何操作数是二进制字符串时,字符串比较区分大小写.

另一种选择是使用COLLATE,

SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)

  • 没有BINARY搜索是敏感的.BINARY意味着它正在比较每个字符的二进制值,而不是它们所代表的字母.在非二进制比较"A"="a"中,其中二进制比较"A"!="a"因为65!= 97.你有这个倒退.然而,这对于那些寻找区分大小写的搜索的人来说非常有用. (7认同)
  • 我认为他希望搜索案例不敏感. (3认同)
  • 二进制REALLY不应该不区分大小写.如果您看到不区分大小写的结果,我怀疑您的测试用例有问题.我想,虽然我不会让它超越MySQL开发者做一些堕落的事情. (3认同)
  • 当我尝试它时,这不起作用,MySQL 5.6 (2认同)
  • 刚试过:'SELECT'a'Like'A'; - 1`; `SELECT'a'Like B'ARY'A'; - 0` 因此二进制搜索不区分大小写.异议? (2认同)
  • @kolypto为什么您的答案说“字符串比较区分大小写”,而这里的注释说“二进制搜索不区分大小写”?如您的示例所示,二进制搜索显然很敏感。 (2认同)

Mar*_*rco 18

试试这个:

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE '%searchterm%'
Run Code Online (Sandbox Code Playgroud)

或(让你看到差异)

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE LOWER('%SearchTerm%')
Run Code Online (Sandbox Code Playgroud)

  • 我想到了.似乎concat_ws将结果转换为BLOB.哪个UPPER和LOWER不起作用.我通过添加CONVERT(... USING utf8)将BLOB转换为UTF8字符串然后在其上运行LOWER函数来修复此问题.SELECT LOWER(CONVERT(CONCAT_WS(title,description)USING utf8)AS concatenated WHERE concatenated LIKE'%searchterm%' (5认同)

Mal*_*glu 5

在此方法中,您不必选择搜索的字段:

SELECT table.id 
FROM table
WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是大约两年前首次发布的……没有必要再做一次。 (2认同)