web-dev-qa-db-ja.com

LIKEワイルドカードを使用して列で(大文字と小文字を区別しないで)検索する方法を教えてください。

私は何人かを見回したが、自分が何をしているのかわからなかったのでここに行く。

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

これはうまくいきますが、ツリーの名前がElmやElmなどの場合は違います。

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

私はMySQL 5とApacheを使っています。

244
David Morrow
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. 

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

241
Quassnoi

私はいつもlowerを使ってこれを解決しました:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%Elm%'
212
cwallenpoole

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

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

例えば。

utf8_general_ciをあなたが役に立つと思うどんな照合とでも交換してください)。 _ci大文字と小文字を区別しないを表します。

44
aioobe

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

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

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

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

単純に使用してください

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

または使用

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

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

18
Vi8L

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

値を小文字にすると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();

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

SELECT * FROM trees WHERE trees.`title` ILIKE '%Elm%';
6
cgupta

mysql 5.5では、operatorは鈍感ですが...あなたの値がElmかElmかElmかElmか他のもので、 '%Elm%'のように使うと、一致する値をすべてリストします。

私はmysqlの以前のバージョンについて言うことができません。

大文字と小文字を区別して作業するのと同じようにOracleを使用する場合は、「%Elm%」のように入力しても、これだけが行われ、大文字は無視されます。

奇妙な、しかしこれはそれがどのようにあるかです:)

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

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

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

大文字と小文字を区別しないで大文字と小文字を区別したい場合は、比較の前にすべての文字列を小文字に変換します。

0
Rbacarin

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

テーブルエンコーディングは実際のデータエンコーディングを反映しなければなりません。あなたのデータエンコーディングは何ですか?

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

0

ILIKEを使用

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

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

0
ABS zarzis