LIKEワイルドカードを使用して列を検索するには(大文字と小文字を区別しない)。


289

周りを見回して、自分が何をしていたのかわからなかったので、ここに行きます。

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

これは正常に機能しますが、ツリーの名前がElmやELMなどの場合は機能しません...

このワイルドカード検索でSQLの大文字と小文字を区別しないようにするにはどうすればよいですか?

MySQL 5とApacheを使用しています。


3
このページでつまずいたが、MySQLの設定がエルムやELMのため、このクエリに作業を行うとした場合、あなたは、それは大文字と小文字を区別することにしたい参照BINARYここのような:stackoverflow.com/questions/7857669/...
joshuahedlund

フィールド/テーブル照合に依存していませんか?like 'ut8_general_CI'
Yousha Aleayoub

それを使用してノードクエリを逐次化する方法は?
Ashh

MySQL likeはデフォルトで大文字と小文字を区別しません。
Marko Bonaci

回答:


281
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. 

これにより、この列のインデックスも再構築され、 '%'を付けずにクエリに使用できるようになります


34
実際、COLLATE UTF8_GENERAL_CI列の定義に追加すると、これらのトリックをすべて省略できます。これは自動的に機能します。ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI。これにより、この列のインデックスも再構築され、先頭に '%'を付けずにクエリで使用できるようになります。
Quassnoi、2010年

1
ALTER TABLE trees MODIFY COLUMN title VARCHAR(…)これは最良の方法のようです。おかげで... sqlに作業を任せましょう
David Morrow

10
これはmysqlの回答であることを覚えておいてください。PostgreSQLを使用している場合、ILikeが上記の質問に対する解決策です。
Steve

2
@RajanRawal:コメントではなく、質問として質問を投稿してください。ありがとう。
Quassnoi 2013年

1
元のコレートがビンではなく一般的だった限り、これは正解です。
greenoldman

261

私は常にこれをlowerを使って解決しました:

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

47
およびインデックスの使用を損なう
あなたの常識

3
MySQL 5にはILIKE演算子がありますか?
ルークモーラー、

27
ただし、%%検索の場合は、とにかく問題ありません:)
常識

5
@Col。-確かに、これはインデックス付きの列には理想的ではありませんが、すでに配置されている構造に対しては機能します。また、大文字と小文字を区別しない検索は、インデックス化されていない列でより頻繁に行われることもわかりました。
cwallenpoole 2010年

1
デフォルトの照合はすでにCIです。したがって、この特定の質問ではない本当の問題。しかし、それはまだ完璧なSOスタイルの答えです。
あなたの常識

48

大文字と小文字の区別は、列/テーブル/データベース照合設定で定義されます。次の方法で、特定の照合でクエリを実行できます。

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

例えば。

utf8_general_ci有用な照合に置き換えてください)。_ciケース小文字を区別しません


1
MySQL 5.6では、ERROR 1273(HY000):Unknown collat​​ion: 'utf_general_ci'が発生します。この照合はMySQLから削除されたと思いますか?utf8_general_ciただし、正常に動作します。
マークアメリー2014

1
同じ問題があった。修正するCOLLATEか、このような簡単なトリックを実行する必要がLOWER()あります(比較前に両方の文字列)
Menelaos Kotsollaris

MySQL 5.6+またはMariaDB 10+では、条件の前にCOLLATE命令を指定するだけで済みます。したがって、これは機能しますSELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
。–スタムスター

41

これは、単純なLIKEクエリの例です。

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

ここで、LOWER()funcを使用して大文字と小文字を区別しません。

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

3
実際、これは特にCOLLATEフォーマットの問題に直面している場合には、非常に優れたソリューションです
Menelaos Kotsollaris

27

単に使用:

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

または使用

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

両方の機能は同じように機能します


15

私はそのようなことをしています。

小文字で値を取得すると、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

このクエリは大文字と小文字を区別しない検索を実行すると思います。

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

1
クエリでILIKEを使用しているときにmysql 5.5で構文エラーが発生する
Steel Brain

18
これはPostgreSQLでのみ機能します。MySQLではありません。postgresql.org/docs/current/static/functions-matching.html
Martin Tournoij 2014年

すでに述べたように、質問はMySQLに関するものであり、答えはPostgreSQLに関するものであり、MySQLでは地獄が機能しないためです。私は反対投票はしませんが、反対投票はどこから来るのか疑問に思わずに
はいら

5

使用する ILIKE

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

それは私のために働いた!


9
MySQLはILIKEをサポートしていませ
ttarchala 2018年

3
これはPostgreSQLで機能します。質問はMySQLに関するものでした。
Telmo Trooper、

4

ALTERテーブルは必要ありません。SELECTワイルドカードを使用する実際のクエリの前に、次のクエリを使用してください。

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

2
これは非常に過小評価されているコメントです。それは最も一般的に質問に対処します。質問では比較をその1つの列のみに限定したい場合があるので、変更テーブルの構文も重要だと思います。
ブライアンクリスマン

1

mysql 5.5では、演算子のように区別されません...したがって、valがelmまたはELMまたはElmまたはeLMまたはその他の場合、「%elm%」のように使用すると、一致するすべての値がリストされます。

以前のバージョンのmysqlについては言えません。

大文字と小文字を区別するようにOracleにアクセスする場合は、 '%elm%'のように入力すると、大文字と小文字が区別されます。

奇妙ですが、これはそうです:)


これは完全に真実ではありません。これは、照合がに設定されている場合にのみ機能し*_ciます。これは、「大文字と小文字を区別しない」を表します。これはたまたまサポートされているすべての文字セットのデフォルトです(show character set;これを確認するための問題)-答えは部分的にtrueです:-)理由だけが間違っています。大文字と小文字を区別しないのは演算子ではなく、デフォルトの照合です。
silverdr 2018年

はい、mはあなたに同意します。これは文字に依存しますが、* _ ci文字を使用している場合は、where句の前にバイナリを使用するオプションしかありません
user21546

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

ギャラリーには、名前が表の列で、テーブル名である
user4189641

2
コードの説明とそれがどのように役立つかを示す説明を追加してください-これは将来的に他の人を助けるでしょう
Our Man in Bananas

0

テーブルに適切なエンコードと照合を設定する必要があります。

テーブルエンコーディングは、実際のデータエンコーディングを反映する必要があります。あなたのデータエンコーディングは何ですか?

テーブルのエンコーディングを確認するには、クエリを実行します SHOW CREATE TABLE tablename


0

大文字小文字を区別しない検索を開発する場合、比較を行う前に、常にすべての文字列を小文字に変換します


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";

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.