代码之家  ›  专栏  ›  技术社区  ›  David Morrow

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

  •  227
  • David Morrow  · 技术社区  · 15 年前

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

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

    这很好,但如果这棵树被命名为榆树或榆树等…

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

    我使用的是MySQL5和Apache。

    13 回复  |  直到 15 年前
        1
  •  227
  •   Amr Eladawy Pierre Henry    8 年前
    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. 
    

    这还将重新生成此列上的任何索引,以便可以将它们用于查询,而不带“%”

        2
  •  201
  •   cwallenpoole    15 年前

    我总是用下面的方法来解决这个问题:

    SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
    
        3
  •  44
  •   Martin Tournoij ravi.zombie    11 年前

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

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

    例如。

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

        4
  •  35
  •   Federico Piragua    11 年前

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

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

    现在,使用lower()func不区分大小写:

    SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
    
        5
  •  14
  •   Dave Doga Oz    8 年前

    我在做类似的事情。

    获取小写和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
  •  14
  •   Vi8L    7 年前

    简单使用:

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

    或使用

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

    两种功能工作原理相同

        7
  •  7
  •   Paulo Tomé user2581643    11 年前

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

    SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
    
        8
  •  0
  •   Your Common Sense    15 年前

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

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

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

        9
  •  0
  •   Rbacarin    15 年前

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

        10
  •  0
  •   user21546    11 年前

    在MySQL5.5中,like操作符不敏感……因此,如果您的vale是elm或elm或elm或elm或任何其他值,而您使用的是像“%elm%”,它将列出所有匹配的值。

    我不能说MySQL的早期版本。

    如果您使用Oracle,比如区分大小写,那么如果您键入类似于“%elm%”,它将只适用于此,而忽略大写。

    很奇怪,但情况是这样的:)

        11
  •  0
  •   Lopofsky    8 年前

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

        set names `utf8`;
        SET COLLATION_CONNECTION=utf8_general_ci;
        SET CHARACTER_SET_CLIENT=utf8;
        SET CHARACTER_SET_RESULTS=utf8;
    
        12
  •  0
  •   ABS zarzis    6 年前

    使用 ILIKE

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

    对我有用!!

        13
  •  -1
  •   Vojtěch Dohnal    10 年前
    SELECT name 
           FROM gallery 
           WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
           GROUP BY name COLLATE utf8_general_ci LIMIT 5