How can I search (case-insensitive) in a column using LIKE wildcard?

MysqlSqlSql LikeCase Insensitive

Mysql Problem Overview


I looked around some and didn't find what I was after so here goes.

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

This works fine, but not if the tree is named Elm or ELM etc...

How do I make SQL case insensitive for this wild-card search?

I'm using MySQL 5 and Apache.

Mysql Solutions


Solution 1 - Mysql

I've always solved this using lower:

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

Solution 2 - Mysql

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

Actually, if you add COLLATE UTF8_GENERAL_CI to your column's definition, you can just omit all these tricks: it will work automatically.

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

This will also rebuild any indexes on this column so that they could be used for the queries without leading '%'

Solution 3 - Mysql

The case sensitivity is defined in the columns / tables / database collation settings. You can do the query under a specific collation in the following way:

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

for instance.

(Replace utf8_general_ci with whatever collation you find useful). The _ci stands for case insensitive.

Solution 4 - Mysql

This is the example of a simple LIKE query:

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

Now, case-insensitive using LOWER() func:

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

Solution 5 - Mysql

Simply use :

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

Or Use

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

Both functions works same

Solution 6 - Mysql

I'm doing something like that.

Getting the values in lowercase and MySQL does the rest

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

And For MySQL PDO Alternative:

        $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();

Solution 7 - Mysql

use ILIKE

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

it worked for me !!

Solution 8 - Mysql

I think this query will do a case insensitive search:

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

Solution 9 - Mysql

Non-binary string comparisons (including LIKE) are case insensitive by default in MySql: https://dev.mysql.com/doc/refman/en/case-sensitivity.html

Solution 10 - Mysql

You don't need to ALTER any table. Just use the following queries, prior to the actual SELECT query that you want to use the wildcard:

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

Solution 11 - Mysql

well in mysql 5.5 , like operator is insensitive...so if your vale is elm or ELM or Elm or eLM or any other , and you use like '%elm%' , it will list all the matching values.

I cant say about earlier versions of mysql.

If you go in Oracle , like work as case-sensitive , so if you type like '%elm%' , it will go only for this and ignore uppercases..

Strange , but this is how it is :)

Solution 12 - Mysql

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

Solution 13 - Mysql

I've always solved like this:

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

Solution 14 - Mysql

You must set up proper encoding and collation for your tables.

Table encoding must reflect the actual data encoding. What is your data encoding?

To see table encoding, you can run a query SHOW CREATE TABLE tablename

Solution 15 - Mysql

When I want to develop insensitive case searchs, I always convert every string to lower case before do comparasion

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid MorrowView Question on Stackoverflow
Solution 1 - MysqlcwallenpooleView Answer on Stackoverflow
Solution 2 - MysqlQuassnoiView Answer on Stackoverflow
Solution 3 - MysqlaioobeView Answer on Stackoverflow
Solution 4 - MysqlFederico PiraguaView Answer on Stackoverflow
Solution 5 - MysqlVi8LView Answer on Stackoverflow
Solution 6 - MysqlDave Doga OzView Answer on Stackoverflow
Solution 7 - MysqlABS zarzisView Answer on Stackoverflow
Solution 8 - MysqlcguptaView Answer on Stackoverflow
Solution 9 - MysqlMarko BonaciView Answer on Stackoverflow
Solution 10 - MysqlLopofskyView Answer on Stackoverflow
Solution 11 - MysqlsimplifiedDBView Answer on Stackoverflow
Solution 12 - Mysqluser4189641View Answer on Stackoverflow
Solution 13 - MysqlShadi View Answer on Stackoverflow
Solution 14 - MysqlYour Common SenseView Answer on Stackoverflow
Solution 15 - MysqlRbacarinView Answer on Stackoverflow