周りを見回しても自分が何を求めているのかわからなかったので、ここに行きます。
SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
これは正常に機能しますが、ツリーの名前がElmやELMなどの場合は機能しません。
このワイルドカード検索でSQLの大文字と小文字を区別しないようにするにはどうすればよいですか?
MySQL5とApacheを使用しています。
周りを見回しても自分が何を求めているのかわからなかったので、ここに行きます。
SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
これは正常に機能しますが、ツリーの名前がElmやELMなどの場合は機能しません。
このワイルドカード検索でSQLの大文字と小文字を区別しないようにするにはどうすればよいですか?
MySQL5とApacheを使用しています。
私はいつもより低いものを使用してこれを解決しました:
SELECT * FROM trees WHERE LOWER( trees.title ) LIKE '%elm%'
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.
これにより、この列のインデックスも再構築されるため、「%」を先頭にせずにクエリに使用できます。
大文字と小文字の区別は、列/テーブル/データベース照合設定で定義されます。次の方法で、特定の照合の下でクエリを実行できます。
SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci
例えば。
utf8_general_ci
(有用と思われる照合に置き換えてください)。大文字と小文字を区別しないの_ci
略です。
これは、単純なLIKEクエリの例です。
SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'
LOWER()関数を使用して大文字と小文字を区別しません。
SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
単に使用してください:
"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE '%elm%'";
または使用する
"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE '%elm%'";
両方の機能は同じように機能します
私はそのようなことをしています。
小文字で値を取得し、MySQLが残りを行います
$string = $_GET['string'];
mysqli_query($con,"SELECT *
FROM table_name
WHERE LOWER(column_name)
LIKE LOWER('%$string%')");
そしてMySQLPDOAlternativeの場合:
$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%';
使用するILIKE
SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
それは私のために働いた!!
非バイナリ文字列の比較(を含むLIKE
)は、MySqlではデフォルトで
大文字と小文字を区別しません: https ://dev.mysql.com/doc/refman/en/case-sensitivevity.html
ALTER
テーブルは必要ありません。SELECT
ワイルドカードを使用する実際のクエリの前に、次のクエリを使用するだけです。
set names `utf8`;
SET COLLATION_CONNECTION=utf8_general_ci;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;
mysql 5.5では、演算子が鈍感であるように...したがって、値がelmまたはELMまたはElmまたはeLMまたはその他であり、'%elm%'のように使用すると、一致するすべての値が一覧表示されます。
以前のバージョンのmysqlについては言えません。
Oracleを使用する場合、大文字と小文字を区別するように機能するため、「%elm%」のように入力すると、これのみが使用され、大文字は無視されます。
奇妙ですが、これがその方法です:)
SELECT name
FROM gallery
WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%'
GROUP BY name COLLATE utf8_general_ci LIMIT 5
テーブルに対して適切なエンコーディングと照合を設定する必要があります。
テーブルエンコーディングは、実際のデータエンコーディングを反映している必要があります。あなたのデータエンコーディングは何ですか?
テーブルのエンコーディングを確認するには、クエリを実行しますSHOW CREATE TABLE tablename
大文字と小文字を区別しない検索を開発する場合は、比較を行う前に、常にすべての文字列を小文字に変換します
私はいつもこのように解決してきました:
SELECT * FROM trees WHERE LOWER( trees.title ) LIKE LOWER('%elm%');
次の方法を使用できます
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";