【问题标题】:Like Case Sensitive in MySQL像 MySQL 中的大小写敏感一样
【发布时间】:2011-12-26 09:00:28
【问题描述】:

我有一个 MySQL 查询:

SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';

我的表是用 MyISAM 编码的 utf8_general_ci。

搜索似乎区分大小写。

我不知道如何解决它。出了什么问题和/或我该如何解决?

【问题讨论】:

标签: mysql case-sensitive sql-like


【解决方案1】:

试试这个:

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE '%searchterm%'

或者(让你看到区别)

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE LOWER('%SearchTerm%')

【讨论】:

  • 试过了,还是区分大小写的。
  • @PmcMachinery:你看到我用小写字符串改变了你的 LIKE 部分吗?
  • 是的,谢谢,我做到了。当我这样做时,我也可以找到大写的“SearchTerms”。 LOWER 似乎没有做任何事情。
  • 我想通了。似乎 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%'
【解决方案2】:

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

SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';

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

另一种选择是使用COLLATE

SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;

【讨论】:

  • 我认为他希望搜索不区分大小写。
  • 无二进制搜索区分大小写。 BINARY 表示它正在比较每个字符的二进制值,而不是它们所代表的字母。在非二进制比较中“A”=“a”,而在二进制比较中“A”!=“a”因为65!= 97。你有这个倒数。然而,这对于那些正在寻找区分大小写搜索的人来说很有用。
  • 刚试过:SELECT 'a' LIKE 'A'; -- 1SELECT 'a' LIKE BINARY 'A'; -- 0。所以二分查找不区分大小写。反对?
  • 二进制真的不应该不区分大小写。如果您看到不区分大小写的结果,我怀疑您的测试用例有问题。虽然我想我不会让 MySQL 开发人员去做这种堕落的事情。
  • @kolypto 为什么你的回答说“字符串比较区分大小写”,而这里的 cmets 说“二进制搜索不区分大小写”?正如您的示例所示,二分搜索显然很敏感。
【解决方案3】:

这是工作代码:

SELECT title,description
FROM (
 SELECT title,description, LOWER(CONCAT_WS(title,description)) AS concatenated
 FROM table1 
) AS Q
WHERE concatenated LIKE LOWER('%search%') 

【讨论】:

    【解决方案4】:

    这也有效:

    SELECT LOWER(DisplayName) as DN
    FROM   Bidders
    WHERE  OrgID=45
    HAVING DN like "cbbautos%"
    LIMIT  10;
    

    【讨论】:

      【解决方案5】:

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

      SELECT table.id 
      FROM table
      WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
      

      【讨论】:

      • 这个答案是大约两年前首次发布的......再做一次没有意义。
      【解决方案6】:

      检查表架构中提到的CHARSET:

      show create table xyz;
      

      基于CHARSET,可以尝试以下方法。

      select name from xyz where name like '%Man%' COLLATE latin1_bin;
      select name from xyz where name like '%Man%' COLLATE utf8_bin;
      

      以下是对我有用的案例,CHARSET=latin1,MySQL version = 5.6。

      mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'Promo%' collate latin1_bin limit 1;
      +-----------------------+
      | installsrc            |
      +-----------------------+
      | PromoBalance_SMS,null |
      +-----------------------+
      1 row in set (0.01 sec)
      
      mysql>
      mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' collate latin1_bin limit 1;
      +---------------------------+
      | installsrc                |
      +---------------------------+
      | PROMO_SMS_MISSEDCALL,null |
      +---------------------------+
      1 row in set (0.00 sec)
      
      mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' limit 1;
      +-----------------------+
      | installsrc            |
      +-----------------------+
      | PromoBalance_SMS,null |
      +-----------------------+
      1 row in set (0.01 sec)
      

      【讨论】:

        【解决方案7】:

        由于表中使用的排序规则,在这种情况下会出现此问题。您已使用 utf8_general_ci 作为排序规则。如果排序规则更改为utf8_general_ci,则搜索将不区分大小写。 因此,一种可能的解决方案是更改排序规则。

        【讨论】:

          【解决方案8】:

          只是为了完成,以防万一:

          https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html 所述,对于默认字符集,默认情况下,非二进制字符串比较不区分大小写。

          因此,执行不区分大小写比较的一种简单方法是将字段转换为 CHAR、VARCHAR 或 TEXT 类型。

          这是一个检查单个字段的示例:

          SELECT * FROM table1 WHERE CAST(`field1` AS CHAR) LIKE '%needle%';
          

          【讨论】:

            猜你喜欢
            • 2010-12-29
            • 2021-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-03
            相关资源
            最近更新 更多