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


289

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

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

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

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

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


3
이 페이지에서 발견하지만 MySQL의 설정이 느릅 나무 또는 ELM이 쿼리에 대한 작업을하고 있다면, 그것은 대소 문자를 구분되고 싶어 참조 BINARY여기에 같은 : stackoverflow.com/questions/7857669/...
joshuahedlund

필드 / 테이블 데이터 정렬에 의존하지 않습니까? 'ut8_general_CI'와 같은
Yousha Aleayoub

sequlize node query를 사용하는 방법은 무엇입니까?
Ashh

MySQL like은 기본적으로 대소 문자를 구분하지 않아야합니다.
Marko Bonaci

답변:


281
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. 

또한이 열에서 인덱스를 다시 작성하여 '%'를 선행하지 않고 쿼리에 사용할 수 있습니다.


34
실제로 COLLATE UTF8_GENERAL_CI열 정의에 추가 하면 이러한 트릭을 모두 생략 할 수 있습니다. 자동으로 작동합니다. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. 또한이 열에서 인덱스를 다시 작성하여 '%'를 선행하지 않고 쿼리에 사용할 수 있습니다.
Quassnoi

1
ALTER TABLE trees MODIFY COLUMN title VARCHAR (…) 이것이 가장 좋은 방법 인 것 같습니다. 감사합니다. sql이 작업을 수행하게하십시오
David Morrow

10
이것이 MySQL의 답변이라는 것을 친절하게 상기시켜줍니다. PostgreSQL을 사용하는 경우 ILike가 위의 질문에 대한 솔루션입니다.
Steve

2
@RajanRawal : 질문이 아니라 질문으로 질문하십시오. 감사.
Quassnoi

1
이것은 원래의 콜레이트가 빈이 아니라 일반인 한 정답입니다.
greenoldman

261

나는 항상 이것을 사용하여 더 낮게 해결했습니다.

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'

47
및 전리품 색인 사용
귀하의 상식

3
MySQL 5에는 ILIKE 연산자가 있습니까?
Luke Maurer

27
%% 검색의 경우 어쨌든 중요하지 않습니다 :)
귀하의 상식

5
@안부. -인덱싱 된 열에 이상적이지는 않지만 이미 존재하는 구조에서는 작동합니다. 또한 대소 문자를 구분하지 않는 검색이 색인되지 않은 열에 더 자주 있음을 발견했습니다.
cwallenpoole

1
기본 데이터 정렬은 이미 CI입니다. 따라서이 특별한 질문에는 실제 문제가 아닙니다. 그러나 여전히 완벽한 SO 스타일 답변입니다.
당신의 상식

48

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

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

예를 들어.

( utf8_general_ci유용한 데이터 정렬로 바꾸십시오). 는 _ci의미 사례를 구분 .


1
MySQL 5.6에서는 ERROR 1273 (HY000) : Unknown collation : 'utf_general_ci'가 발생 합니다. 이 데이터 정렬이 MySQL에서 제거 된 것 같습니다. utf8_general_ci그래도 잘 작동합니다.
Mark Amery

1
같은 문제가 있었다. 당신도 당신의 문제를 해결해야 COLLATE하거나 같은 간단한 트릭을 할 이 하나 ( LOWER()비교하기 전에 문자열 모두)
Menelaos Kotsollaris

MySQL 5.6 이상 또는 MariaDB 10 이상에서는 조건 전에 COLLATE 명령을 제공하면됩니다. 그래서 이것은 작동합니다 :SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
stamster

41

다음은 간단한 LIKE 쿼리의 예입니다.

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

이제 LOWER () func을 사용하여 대소 문자를 구분하지 않습니다.

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

3
실제로 이것은 COLLATE형식 문제에 직면했을 때 특히 좋은 해결책입니다
Menelaos Kotsollaris

27

간단히 사용하십시오 :

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

또는 사용

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

두 기능 모두 동일하게 작동


15

나는 그런 일을하고 있습니다.

소문자로 값을 가져오고 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();

6

이 쿼리는 대소 문자를 구분하지 않는 검색을 수행한다고 생각합니다.

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

1
쿼리에서 ILIKE를 사용하는 동안 mysql 5.5에서 구문 오류가 발생합니다
Steel Brain

18
이것은 PostgreSQL에서만 작동합니다. MySQL이 아닙니다. postgresql.org/docs/current/static/functions-matching.html
Martin Tournoij 2016 년

이미 언급했듯이 MySQL에 대한 질문과 PostgreSQL에 대한 답변이며 MySQL에서 작동하지 않습니다. 나는 그것을 투표하지 않지만 투표가 어디에서 오는지 궁금해 할 수 없다.
silverdr

5

사용하다 ILIKE

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

그것은 나를 위해 일했다!!


9
MySQL은 ILIKE를 지원 하지 않습니다 .
ttarchala

3
그것은 PostgreSQL에서 작동하며 MySQL에 관한 문제였습니다.
Telmo Trooper 19 :

4

ALTER어떤 테이블도 필요하지 않습니다 . SELECT와일드 카드를 사용하려는 실제 쿼리 전에 다음 쿼리 를 사용하십시오.

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

2
이것은 매우 과소 평가 된 의견입니다. 가장 일반적으로 문제를 해결합니다. 질문은 비교가 하나의 열로만 제한되기를 원할 수 있기 때문에 alter table 구문도 중요하다고 생각합니다.
Brian Chrisman

1

mysql 5.5에서는 연산자가 둔감 한 것처럼 ... 귀하의 값이 elm 또는 ELM, Elm 또는 eLM 또는 기타이고 '% elm %'과 같이 사용하면 일치하는 모든 값이 나열됩니다.

이전 버전의 mysql에 대해서는 말할 수 없습니다.

대 / 소문자를 구분하여 작업하는 것과 같이 Oracle을 사용하는 경우 '% elm %'과 같이 입력하면이 경우에만 사용되며 대문자는 무시됩니다.

이상하지만 이것이 방법입니다 :)


이것은 사실이 아닙니다. 데이터 정렬이로 설정된 경우에만 작동 *_ci하며 "대소 문자 구분 안 함"을 나타냅니다. 지원되는 모든 문자 세트에 대해 이것이 기본으로 발생하므로 ( show character set;이를 확인하는 문제 )-대답은 부분적으로 사실입니다 :-) 이유 만 올바르지 않습니다. 대소 문자를 구분하지 않는 연산자가 아니며 기본 데이터 정렬입니다.
silverdr

네 동의합니다. 문자에 따라 다르지만 여전히 * _ci 문자로 프로덕션 환경에있는 경우 옵션 만 where 절 앞에 바이너리를 사용하는 것입니다
user21546

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

gallery는 table-name이고 name은 테이블의 열입니다.
user4189641

2
코드의 기능과 작동 방식을 보여주는 코드 설명을 추가하십시오. 향후 다른 사람들을 도울 것입니다
바나나에있는 우리의 남자

0

테이블에 적절한 인코딩 및 데이터 정렬을 설정해야합니다.

테이블 인코딩은 실제 데이터 인코딩을 반영해야합니다. 데이터 인코딩은 무엇입니까?

테이블 인코딩을 보려면 쿼리를 실행할 수 있습니다 SHOW CREATE TABLE tablename


0

대소 문자를 구분하지 않으려면 항상 비교하기 전에 모든 문자열을 소문자로 변환하십시오.


0

다음 방법을 사용할 수 있습니다

 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";

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.