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


288

我环顾四周,却找不到我想要的东西,所以去了。

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

这很好用,但是如果树被命名为Elm或ELM等则不行。

如何使此通配符搜索的SQL大小写不敏感?

我正在使用MySQL 5和Apache。


3
如果你无意中发现这个页面上,但你的MySQL设置做这个查询榆木或ELM的工作,你希望它是区分大小写的,见BINARY如这里:stackoverflow.com/questions/7857669/...
joshuahedlund

它不取决于字段/表排序规则吗?像'ut8_general_CI'
有啥Aleayoub

如何使用它来排序节点查询?
阿什(Ashh),

MySQL like默认情况下不区分大小写。
Marko Bonaci

Answers:


280
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

实际上,如果添加COLLATE UTF8_GENERAL_CI到列的定义中,则可以忽略所有这些技巧:它将自动运行。

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

这还将重建该列上的所有索引,以便可以将其用于查询而无需以“%”开头


34
实际上,如果添加COLLATE UTF8_GENERAL_CI到列的定义中,则可以忽略所有这些技巧:它将自动运行。ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI。这还将重建该列上的所有索引,以便它们可用于查询而无需前导'%'。
Quassnoi

1
ALTER TABLE树修改列标题VARCHAR(...),这似乎是最好的方法,非常感谢...让sql来完成工作
David Morrow 2010年

10
友好提醒,这是一个mysql答案。如果您使用的是PostgreSQL,则ILike是上述问题的解决方案。
史蒂夫(Steve)

2
@RajanRawal:请将您的问题作为问题而不是评论发表。谢谢。
Quassnoi

1
只要您的原始整理是一般性的,而不是bin,这是正确的答案。
greenoldman '16

261

我总是用lower解决这个问题:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'

47
和破坏指数的使用
您的常识2010年

3
MySQL 5是否具有ILIKE运算符?
路加·莫雷尔

27
虽然对于%%的搜索来说,这没关系:)
您的常识

5
@Col。-诚然,这对于索引列而言并不理想,但是它将对已经存在的结构起作用。我还发现,不区分大小写的搜索更多地出现在无论如何都没有索引的列上。
cwallenpoole

1
默认排序规则已经是CI。因此,真正的问题不在此特定问题中。但这仍然是SO风格的完美答案。
您的常识2010年

48

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

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

例如。

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


1
在MySQL 5.6中,我收到错误1273(HY000):未知归类:'utf_general_ci'。我猜想这种排序规则已从MySQL中删除?utf8_general_ci不过效果很好。
Mark Amery 2014年

1
有同样的问题。你要么必须解决您的COLLATE或做简单的伎俩像这样一个LOWER()对比前两者的字符串)
墨涅拉俄斯Kotsollaris

在MySQL 5.6+或MariaDB 10+中,您只需要在条件之前提供COLLATE指令即可。这样就可以了:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
stamster

41

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

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

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

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')

3
其实这是尤其是当你面对的是一个相当不错的解决方案COLLATE格式的问题
墨涅拉俄斯Kotsollaris

27

只需使用:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";

或使用

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

两种功能均相同


15

我正在做类似的事情。

以小写形式获取值,其余部分由MySQL完成

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

对于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();

6

我认为此查询将执行不区分大小写的搜索:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

1
我在查询中使用ILIKE时在mysql 5.5上遇到语法错误
Steel Brain


如前所述,问题是关于MySQL的,而答案是关于PostgreSQL的,请确保地狱不适用于MySQL。我不投票,但不禁想知道投票来自何方……
silverdr

4

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

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;

2
这是一个被低估的评论。它最普遍地解决了这个问题。我确实认为alter table语法也很重要,因为问题可能希望比较仅限于该列。
布莱恩·克里斯曼

4

采用 ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

它为我工作!


9
MySQL的支持ILIKE。
ttarchala

3
这适用于PostgreSQL,问题是关于MySQL。
Telmo Trooper

1

很好地在mysql 5.5中,像运算符是不敏感的...因此,如果您的vale是elm或ELM或Elm或eLM或其他任何东西,而您使用的像'%elm%',它将列出所有匹配的值。

我不能说早期版本的mysql。

如果您使用的是Oracle,就像对大小写敏感的工作一样,那么如果您输入'%elm%',它将只适用于此,而忽略大写字母。

奇怪,但这就是事实:)


这并非完全正确。只有将排序规则设置为时*_ci,它才可以工作,表示“不区分大小写”。由于这恰好是所有支持的字符集的默认设置(show character set;请检查此问题)-答案部分正确:-)仅原因不正确。不区分大小写的不是运算符,而是默认排序规则。
silverdr

是的,我同意你的看法。它取决于字符,并且如果您仍在使用* _ci字符进行生产,则唯一的选择是在where子句之前使用二进制文件
user21546 '18

1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 

gallery是表名,name是表中的列,
2014年

2
请添加一些代码说明,以说明其作用以及如何帮助您-将来会对他人有所帮助
我们的香蕉

0

您必须为表设置正确的编码和排序规则。

表编码必须反映实际的数据编码。您的数据编码是什么?

要查看表编码,可以运行查询 SHOW CREATE TABLE tablename


0

当我想进行不区分大小写的搜索时,在进行比较之前,我总是将每个字符串都转换为小写


0

您可以使用以下方法

 private function generateStringCondition($value = '',$field = '', $operator = '', $regex = '', $wildcardStart = '', $wildcardEnd = ''){
        if($value != ''){
            $where = " $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd' ";

            $searchArray = explode(' ', $value);

            if(sizeof($searchArray) > 1){

                foreach ($searchArray as $key=>$value){
                    $where .="$operator $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd'";
                }

            }

        }else{
            $where = '';
        }
        return $where;
    }

使用如下所示的方法

   $where =  $this->generateStringCondition($yourSearchString,  'LOWER(columnName)','or', 'like',  '%', '%');
  $sql = "select * from table $where";

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.