[mysql] LIKE 와일드 카드를 사용하여 열에서 어떻게 대소 문자를 구분하지 않고 검색 할 수 있습니까?

나는 몇 가지를 둘러 보았고 내가 겪은 것을 찾지 못했습니다.

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

이것은 잘 작동하지만 나무의 이름이 Elm 또는 ELM 등인 경우에는 그렇지 않습니다.

이 와일드 카드 검색에서 SQL 대소 문자를 구분하지 않게하려면 어떻게합니까?

MySQL 5와 Apache를 사용하고 있습니다.



답변

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 LOWER( trees.title ) LIKE  '%elm%'


답변

대 / 소문자 구분은 열 / 테이블 / 데이터베이스 데이터 정렬 설정에서 정의됩니다. 다음과 같은 방법으로 특정 데이터 정렬에서 쿼리를 수행 할 수 있습니다.

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 () func을 사용하여 대소 문자를 구분하지 않습니다.

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%')");

그리고 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%';