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

问题描述 投票:0回答:16

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

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

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

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

我正在使用 MySQL 5 和 Apache。

mysql sql sql-like case-insensitive
16个回答
457
投票

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

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

336
投票
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. 

这还将重建该列上的所有索引,以便它们可以用于查询而无需前导“%”


58
投票

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

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

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

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

54
投票

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

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

例如。

(将

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


51
投票

简单使用:

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

或使用

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

两个功能相同


17
投票

我正在做类似的事情。

获取小写值,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();

12
投票

在 MySql 中,非二进制字符串比较(包括

LIKE
)默认是 不区分大小写的: https://dev.mysql.com/doc/refman/en/case-sensitivity.html


9
投票
使用

ILIKE



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

它对我有用!!


8
投票
我认为这个查询将进行不区分大小写的搜索:

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

6
投票
您不需要

ALTER

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

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

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

我不能说早期版本的 mysql。

如果你进入 Oracle ,就像区分大小写一样,所以如果你输入像 '%elm%' 这样的内容,它只会执行此操作并忽略大写..

奇怪,但事实就是这样:)


3
投票
我总是这样解决:

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

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

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

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

要查看表编码,您可以运行查询

SHOW CREATE TABLE tablename


    


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


-2
投票
试试这个,它对我有用。

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
    
© www.soinside.com 2019 - 2024. All rights reserved.