나는 몇 가지를 둘러 보았고 내가 겪은 것을 찾지 못했습니다.
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
. 또한이 열에서 인덱스를 다시 작성하여 '%'를 선행하지 않고 쿼리에 사용할 수 있습니다.
나는 항상 이것을 사용하여 더 낮게 해결했습니다.
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에서는 연산자가 둔감 한 것처럼 ... 귀하의 값이 elm 또는 ELM, Elm 또는 eLM 또는 기타이고 '% elm %'과 같이 사용하면 일치하는 모든 값이 나열됩니다.
이전 버전의 mysql에 대해서는 말할 수 없습니다.
대 / 소문자를 구분하여 작업하는 것과 같이 Oracle을 사용하는 경우 '% elm %'과 같이 입력하면이 경우에만 사용되며 대문자는 무시됩니다.
이상하지만 이것이 방법입니다 :)
*_ci
하며 "대소 문자 구분 안 함"을 나타냅니다. 지원되는 모든 문자 세트에 대해 이것이 기본으로 발생하므로 ( show character set;
이를 확인하는 문제 )-대답은 부분적으로 사실입니다 :-) 이유 만 올바르지 않습니다. 대소 문자를 구분하지 않는 연산자가 아니며 기본 데이터 정렬입니다.
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";
이진이 아닌 문자열 비교 (포함 LIKE
)는 기본적으로 MySql에서 대소 문자를 구분하지 않습니다 .
https://dev.mysql.com/doc/refman/en/case-sensitivity.html
BINARY
여기에 같은 : stackoverflow.com/questions/7857669/...