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

时间:2010-05-20 18:39:46

标签: mysql sql case-insensitive

我环顾四周,但没有找到我的意思,所以这里就去了。

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

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

如何对这种外卡搜索使SQL不区分大小写?

我正在使用MySQL 5和Apache。

15 个答案:

答案 0 :(得分:238)

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. 

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

答案 1 :(得分:210)

我总是用较低的方法解决这个问题:

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

答案 2 :(得分:44)

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

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

(将utf8_general_ci替换为您认为有用的任何归类)。 _ci代表不区分大小写

答案 3 :(得分:35)

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

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

现在,使用LOWER()func:

不区分大小写
SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')

答案 4 :(得分:17)

只需使用:

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

或使用

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

两个功能都相同

答案 5 :(得分:14)

我正在做那样的事情。

以小写形式获取值,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 :(得分:6)

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

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

答案 7 :(得分:1)

在mysql 5.5中,操作符不敏感...所以如果你的谷是elm或ELM或Elm或eLM或任何其他,你使用像&#39;%elm%&#39; ,它将列出所有匹配的值。

我不能说早期版本的mysql。

如果你进入Oracle,就像工作区分大小写一样,那么如果你输入的类似于&#39;%elm%&#39; ,它只会为此而忽略大写..

很奇怪,但事实就是如此:)

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

当我想开发不敏感的案例搜索时,我总是会在比较之前将每个字符串转换为小写

答案 13 :(得分: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";

答案 14 :(得分:-1)

使用mapped_type

ILIKE

对我有用!