周りを見回して、自分が何をしていたのかわからなかったので、ここに行きます。
SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
これは正常に機能しますが、ツリーの名前がElmやELMなどの場合は機能しません...
このワイルドカード検索でSQLの大文字と小文字を区別しないようにするにはどうすればよいですか?
MySQL 5とApacheを使用しています。
like
はデフォルトで大文字と小文字を区別しません。
周りを見回して、自分が何をしていたのかわからなかったので、ここに行きます。
SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
これは正常に機能しますが、ツリーの名前がElmやELMなどの場合は機能しません...
このワイルドカード検索でSQLの大文字と小文字を区別しないようにするにはどうすればよいですか?
MySQL 5とApacheを使用しています。
like
はデフォルトで大文字と小文字を区別しません。
回答:
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.
これにより、この列のインデックスも再構築され、 '%'を付けずにクエリに使用できるようになります
COLLATE UTF8_GENERAL_CI
列の定義に追加すると、これらのトリックをすべて省略できます。これは自動的に機能します。ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI
。これにより、この列のインデックスも再構築され、先頭に '%'を付けずにクエリで使用できるようになります。
私は常にこれをlowerを使って解決しました:
SELECT * FROM trees WHERE LOWER( trees.title ) LIKE '%elm%'
大文字と小文字の区別は、列/テーブル/データベース照合設定で定義されます。次の方法で、特定の照合でクエリを実行できます。
SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci
例えば。
(utf8_general_ci
有用な照合に置き換えてください)。_ci
略ケース小文字を区別しません。
utf8_general_ci
ただし、正常に動作します。
SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
これは、単純なLIKEクエリの例です。
SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'
ここで、LOWER()funcを使用して大文字と小文字を区別しません。
SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
COLLATE
フォーマットの問題に直面している場合には、非常に優れたソリューションです
私はそのようなことをしています。
小文字で値を取得すると、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%';
使用する ILIKE
SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
それは私のために働いた!
ALTER
テーブルは必要ありません。SELECT
ワイルドカードを使用する実際のクエリの前に、次のクエリを使用してください。
set names `utf8`;
SET COLLATION_CONNECTION=utf8_general_ci;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;
mysql 5.5では、演算子のように区別されません...したがって、valがelmまたはELMまたはElmまたはeLMまたはその他の場合、「%elm%」のように使用すると、一致するすべての値がリストされます。
以前のバージョンのmysqlについては言えません。
大文字と小文字を区別するようにOracleにアクセスする場合は、 '%elm%'のように入力すると、大文字と小文字が区別されます。
奇妙ですが、これはそうです:)
*_ci
ます。これは、「大文字と小文字を区別しない」を表します。これはたまたまサポートされているすべての文字セットのデフォルトです(show character set;
これを確認するための問題)-答えは部分的にtrueです:-)理由だけが間違っています。大文字と小文字を区別しないのは演算子ではなく、デフォルトの照合です。
SELECT name
FROM gallery
WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%'
GROUP BY name COLLATE utf8_general_ci LIMIT 5
次の方法を使用できます
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";
MySqlでは、非バイナリ文字列比較(を含むLIKE
)はデフォルトで大文字と小文字を区別しません:https :
//dev.mysql.com/doc/refman/en/case-sensitiveivity.html
BINARY
ここのような:stackoverflow.com/questions/7857669/...