如何使用LIKE通配符在列中搜索(不区分大小写)?

Dav*_*row 266 mysql sql case-insensitive sql-like

我环顾了一些,但没有找到我之后的情况.

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'
Run Code Online (Sandbox Code Playgroud)

这工作正常,但如果树名为Elm或ELM等,则不行......

如何使这种通配符搜索的SQL不区分大小写?

我正在使用MySQL 5和Apache.

Qua*_*noi 257

SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'
Run Code Online (Sandbox Code Playgroud)

实际上,如果你添加COLLATE UTF8_GENERAL_CI到列的定义中,你可以省略所有这些技巧:它会自动运行.

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 
Run Code Online (Sandbox Code Playgroud)

这也将重建此列上的任何索引,以便它们可用于查询而不会导致'%'

  • 实际上,如果你在列的定义中添加`COLLATE UTF8_GENERAL_CI`,你可以省略所有这些技巧:它会自动运行.`ALTER TABLE树MODIFY COLUMN title VARCHAR(...)CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI`.这还将重建此列上的任何索引,以便它们可用于查询而不会引导'%'. (32认同)
  • 友情提醒,这是一个mysql的答案.如果你正在使用PostgreSQL,ILike就是上述问题的解决方案. (10认同)
  • **重要** MySQL 的“UTF8”**不是** UTF8。这是一种损坏的 MySQL 专有编码,最大长度为 3 个字节。Real UTF8 支持[最多 4 个字节](https://stijndewitt.com/2014/08/09/max-bytes-in-a-utf-8-char/)。**不要**使用任何 MySQL 'UTF8' 编码或排序规则!相反,请使用“UTF8MB4”,MySQL 后来添加了它来表示世界其他地方称为“UTF8”的编码。我知道,这很令人困惑。但这会困扰你!研究这个或被它咬。快速测试:尝试插入像❤️这样的表情符号。如果你使用 MySQL `UTF8` 将会失败。如果您使用 MySQL `UTF8MB4` 它会按预期工作。 (5认同)
  • 当表格格式化为"latin1"时,如何做到这一点? (4认同)
  • @RajanRawal:请将您的问题发布为问题,而不是评论.谢谢. (2认同)

cwa*_*ole 235

我总是使用较低的解决方法:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
Run Code Online (Sandbox Code Playgroud)

  • 和破坏索引使用 (43认同)
  • 虽然%%搜索无论如何都无关紧要:) (26认同)
  • @col. - 不可否认,这对于索引列来说并不理想,但它适用于已经存在的结构.我还发现,不区分大小写的搜索更常出现在未编制索引的列上. (5认同)
  • MySQL 5是否有ILIKE运算符? (2认同)
  • 关于索引,如果您确实需要优化不区分大小写的搜索,那么您的表中将有一个额外的列,其中包含已映射为小写(或大写)的目标字段,然后您将在该列上创建索引. 缺点是你现在有一个更大的未标准化的数据库。但是您的搜索速度很快。 (2认同)

aio*_*obe 45

区分大小写在列/表/数据库排序规则设置中定义.您可以通过以下方式在特定排序规则下执行查询:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

例如.

(替换utf8_general_ci为您认为有用的任何排序规则).该_ci代表不区分大小写.


小智 38

这是一个简单LIKE查询的示例:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'
Run Code Online (Sandbox Code Playgroud)

现在,使用LOWER()函数不区分大小写:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这是一个非常好的解决方案,尤其是当您遇到`COLLATE`格式问题时 (3认同)

Vi8*_*i8L 23

只需使用:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";
Run Code Online (Sandbox Code Playgroud)

或者使用

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";
Run Code Online (Sandbox Code Playgroud)

两个功能都相同


Doğ*_*ğlu 14

我正在做那样的事情.

以小写形式获取值,MySQL完成其余的工作

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");
Run Code Online (Sandbox Code Playgroud)

对于MySQL PDO替代方案:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();
Run Code Online (Sandbox Code Playgroud)


Mar*_*aci 12

在 MySql 中, 非二进制字符串比较(包括LIKE)默认不区分大小写: https ://dev.mysql.com/doc/refman/en/case-sensitivity.html


小智 7

我认为这个查询会做一个不区分大小写的搜索:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于PostgreSQL; 不是MySQL.http://www.postgresql.org/docs/current/static/functions-matching.html (17认同)

小智 6

ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
Run Code Online (Sandbox Code Playgroud)

它对我有用!!

  • MySQL 不*不*支持 ILIKE。 (16认同)
  • 这适用于 PostgreSQL,问题是关于 MySQL 的。 (8认同)

Lop*_*sky 5

你不需要ALTER任何桌子。只需在SELECT要使用通配符的实际查询之前使用以下查询:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常被低估的评论。它最普遍地解决了这个问题。我确实认为 alter table 语法也很重要,因为问题可能希望比较仅限于那一列。 (2认同)