363

我环顾四周,没有找到我想要的东西,所以就到这里了。

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

这工作正常,但如果树被命名为榆树或榆树等...

对于这个通配符搜索,如何使 SQL 不区分大小写?

我正在使用 MySQL 5 和 Apache。

4

16 回答 16

345

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

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
于 2010-05-20T18:41:22.930 回答
309
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. 

这还将重建此列上的任何索引,以便它们可以用于不带前导 '%' 的查询

于 2010-05-20T18:44:17.750 回答
51

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

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

例如。

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

于 2010-05-20T18:43:19.403 回答
48

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

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

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

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
于 2014-07-19T20:50:25.567 回答
45

只需使用:

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

或使用

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

两个功能都一样

于 2018-01-09T11:50:10.363 回答
16

我正在做类似的事情。

获取小写的值,其余的由 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();
于 2015-06-01T10:22:33.600 回答
8

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

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
于 2013-08-13T14:38:55.943 回答
8

利用ILIKE

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

它对我有用!

于 2018-11-08T14:40:42.020 回答
6

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

于 2020-04-28T08:31:24.103 回答
5

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

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
于 2017-06-22T09:52:56.703 回答
2

在 mysql 5.5 中,like 运算符是不敏感的......所以如果你的 vale 是 elm 或 ELM 或 Elm 或 eLM 或任何其他,并且你使用 like '%elm%' ,它将列出所有匹配的值。

我不能说早期版本的mysql。

如果你进入 Oracle ,就像区分大小写一样工作,所以如果你输入像 '%elm%' ,它只会为此而忽略大写..

奇怪,但这就是它的样子:)

于 2014-04-24T12:29:16.853 回答
1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
于 2014-10-28T11:28:54.950 回答
0

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

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

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

于 2010-05-20T18:42:16.540 回答
0

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

于 2010-05-20T19:07:44.597 回答
0

我一直是这样解决的:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  LOWER('%elm%');
于 2022-02-01T13:20:51.547 回答
-1

您可以使用以下方法

 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";
于 2020-01-21T10:07:27.837 回答